藍橋杯決賽之排日程

2021-07-31 03:20:31 字數 1809 閱讀 7159

【程式設計題】(滿分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.任何一天,必須保證 ...