【程式設計題】(滿分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
分析:本題就是簡單的暴搜加剪枝,每個人一周內每天有工作和休息兩種情況,對於5*7的矩陣,從上到下,從左到右遍歷遞迴,每遇到當前已經確定的作息錶能進行判斷的情況,就進行判斷,比如,某行的資料確定,即改行代表的某人一周的作息表確定,那麼據此可以進行第乙個條件和最基本的條件(每週需要工作5天,休息2天),如果滿足,那麼繼續下一行的搜尋,不滿足,那麼這條路就結束,開始下一條路,這樣就起到了剪枝的效果.原始碼如下:
#include#include#includeusing namespace std;
int arr[5][7];
//int arr[5][7]=,,,,};
int index=1;
void print() }
bool check()
}if(quanshang==true) quan++;
} if(quan<3) return false;
for(int c=0;c<7;c++) //第三個條件,任何一天,必須保證 a b c d 中至少有2人上班。
int ac=0; //第六個條件,a c 一周中必須至少有4天能見面(即同時上班)
for(int c=0;c<7;c++)
if(ac<4) return false;
return true;
}bool checkhang(int hang)
if(gong!=5) return false;
for(int start=0;start<=6;start++)
return true;
}void dfs(int x,int y)
if(x==5 && y==0) //遍歷到最後乙個元素arr[4][6]的下乙個元素
int nextx=x;
int nexty=y+1;
if(nexty>6) //一行結束
if(y==6 && (x==1 || x==3 || x==4) )
else if(y==2 && (x==0 || x==4))
else
}int main()
ps:每個月至少四篇部落格,要加油~
2015藍橋杯決賽
五月二十八號,坐上了開往北京的火車。第一次到北京參加全國性的比賽,第六屆藍橋杯決賽,心裡面還是很興奮的,同時也有一點點緊張,還是希望自己能拿乙個比較好的成績。提前一天到,大家看了看考場,比賽地點在北大計算中心,30號下午一點開始了正式的比賽,比賽時間四個小時。比賽題目型別和初賽差不多,有結果填空,填...
藍橋杯決賽之方塊填數
程式設計題 滿分33分 數獨 是當下炙手可熱的智力遊戲。一般認為它的起源是 拉丁方塊 是大數學家尤拉於1783年發明的。如圖 1.jpg 所示 6x6的小格被分為6個部分 圖中用不同的顏色區分 每個部分含有6個小格 以下也稱為分組 開始的時候,某些小格中已經填寫了字母 abcdef之一 需要在所有剩...
藍橋杯 排日期
某保密單位機要人員 a,b,c,d,e 每週需要工作5天,休息2天。上級要求每個人每週的工作日和休息日安排必須是固定的,不能在週間變更。此外,由於工作需要,還有如下要求 1.所有人的連續工作日不能多於3天 注意 週日連到下周一也是連續 2.一周中,至少有3天所有人都是上班的。3.任何一天,必須保證 ...