蓝桥杯-排日程
【編程題】(滿分32分)
? ? 某保密單位機要人員 A,B,C,D,E 每周需要工作5天,休息2天。
? ? 上級要求每個人每周的工作日和休息日安排必須是固定的,不能在周間變更。
? ? 此外,由于工作需要,還有如下要求:
? ? 1. 所有人的連續工作日不能多于3天(注意:周日連到下周一也是連續)。
? ? 2. 一周中,至少有3天所有人都是上班的。
? ? 3. 任何一天,必須保證 A B C D 中至少有2人上班。
? ? 4. B D E 在周日那天必須休息。
? ? 5. A E 周三必須上班。
? ? 6. A C 一周中必須至少有4天能見面(即同時上班)。
? ? 你的任務是:編寫程序,列出ABCDE所有可能的一周排班情況。工作日記為1,休息日記為0
? ??
? ? A B C D E 每人占用1行記錄,從星期一開始。
【輸入、輸出格式要求】
? ? 程序沒有輸入,要求輸出所有可能的方案。
? ? 每個方案是7x5的矩陣。只有1和0組成。 ? ? ? ?
? ??
? ? 矩陣中的列表示星期幾,從星期一開始。
? ? 矩陣的行分別表示A,B,C,D,E的作息時間表。
? ? 多個矩陣間用空行分隔開。
? ? 例如,如下的矩陣就是一個合格的解。請編程輸出所有解(多個解的前后順序不重要)。
0110111
1101110
0110111
1101110
1110110
java代碼如下:
?
//排日程 public class js_cgz_05 {private static int[][] types;public static void main(String[] args) {//根據條件://1.必須工作5天,休息2天//2.不能連續工作超過3天//根據以上兩個條件可以確定每個人的時間安排只可能有7種可能//即以下這七種情況:(0表示休息,1表示上班) // 0 1 1 1 0 1 1 // 1 0 1 1 1 0 1 // 1 1 0 1 1 1 0 // 0 1 1 0 1 1 1 // 1 0 1 1 0 1 1 // 1 1 0 1 1 0 1 // 1 1 1 0 1 1 0types=new int[7][7]; int j=0;//初始化types數組,i表示第一個0出現的下標,j表示第二個0出現的下標for(int i=0;i<7;i++){j=(i+4)%7;for(int t=0;t<7;t++){if(t==i||t==j){types[i][t]=0;}else{types[i][t]=1;}}}//types初始化結束//測試所有情況,每個人都可以從7種可能的工作情況中選一種,所以一共有5^7種可能for(int a=0;a<7;a++){//a=i表示A采用第i種工作情況// A周三必須上班if(types[a][2]==0)continue;for(int b=0;b<7;b++){// B在周日那天必須休息if(types[b][6]==1)continue;for(int c=0;c<7;c++){// A C 一周中必須至少有4天能見面(即同時上班)if(!validateAC(a, c))continue;for(int d=0;d<7;d++){//D在周日那天必須休息if(types[d][6]==1)continue;//任何一天,必須保證ABCD中至少有2人上班if(!validateABCD(a, b, c, d))continue;for(int e=0;e<7;e++){//E 周三必須上班,周日那天必須休息if(types[e][2]==0||types[e][6]==1)continue;// 一周中,至少有3天所有人都是上班的if(!validateAll(a, b, c, d, e))continue;print(a, b, c, d, e);}}}}}}//判斷ABCD每天是否至少有2人上班,是返回true,否返回falsepublic static boolean validateABCD(int a,int b,int c,int d){for(int i=0;i<7;i++){if(types[a][i]+types[b][i]+types[c][i]+types[d][i]<2)return false;}return true;}//判斷一周中是否至少有3天所有人都是上班的public static boolean validateAll(int a,int b,int c,int d,int e){int days=0;for(int i=0;i<7;i++){if(types[a][i]+types[b][i]+types[c][i]+types[d][i]+types[e][i]==5)days++;}return days>=3;}//判斷一周中是否A,C至少有4天能見面public static boolean validateAC(int a,int c){int days=0;for(int i=0;i<7;i++){if(types[a][i]+types[c][i]==2)days++;}return days>=4;}//打印結果public static void print(int a,int b,int c,int d,int e){for(int i=0;i<7;i++)System.out.print(types[a][i]);System.out.println();for(int i=0;i<7;i++)System.out.print(types[b][i]);System.out.println();for(int i=0;i<7;i++)System.out.print(types[c][i]);System.out.println();for(int i=0;i<7;i++)System.out.print(types[d][i]);System.out.println();for(int i=0;i<7;i++)System.out.print(types[e][i]);System.out.println();System.out.println();} }
輸出:
?
?
0111011 1110110 0111011 1110110 11101101011101 1110110 1011101 1110110 11101100110111 1101110 0110111 1101110 11101101011011 1110110 1011011 1110110 1110110?
總結
- 上一篇: Exchange 2007迁移2010后
- 下一篇: Ubuntu下安装配置Hadoop独立模