title: 某保密單位機(jī)要人員-解題報(bào)告
date: 2016-03-27 16:12:39
tags: 算法
categories: 算法
某保密單位機(jī)要人員 A科吭,B规伐,C培慌,D馅而,E 每周需要工作5天屯蹦,休息2天帖渠。
上級(jí)要求每個(gè)人每周的工作日和休息日安排必須是固定的狞甚,不能在周間變更涩盾。
此外,由于工作需要,還有如下要求:
1. 所有人的連續(xù)工作日不能多于3天(注意:周日連到下周一也是連續(xù))喧伞。
2. 一周中,至少有3天所有人都是上班的挪圾。
3. 任何一天棚赔,必須保證 A B C D 中至少有2人上班。
4. B D E 在周日那天必須休息。
5. A E 周三必須上班。
6. A C 一周中必須至少有4天能見(jiàn)面(即同時(shí)上班)条辟。
你的任務(wù)是:編寫程序婚惫,列出ABCDE所有可能的一周排班情況蒋川。工作日記為1裂逐,休息日記為0
A B C D E 每人占用1行記錄掺涛,從星期一開(kāi)始矮燎。
【輸入、輸出格式要求】
程序沒(méi)有輸入,要求輸出所有可能的方案婴氮。
每個(gè)方案是7x5的矩陣罩驻。只有1和0組成蜓席。
矩陣中的列表示星期幾,從星期一開(kāi)始固棚。
矩陣的行分別表示A娶桦,B,C,D,E的作息時(shí)間表橄杨。
多個(gè)矩陣間用空行分隔開(kāi)。
例如板熊,如下的矩陣就是一個(gè)合格的解喘沿。請(qǐng)編程輸出所有解(多個(gè)解的前后順序不重要)肪获。
0110111
1101110
0110111
1101110
1110110
【注意】
請(qǐng)仔細(xì)調(diào)試!您的程序只有能運(yùn)行出正確結(jié)果的時(shí)候才有機(jī)會(huì)得分!
在評(píng)卷時(shí)使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的魄衅。
請(qǐng)把所有函數(shù)寫在同一個(gè)文件中,調(diào)試好后草巡,拷貝到【考生文件夾】下對(duì)應(yīng)題號(hào)的“解答.txt”中即可。
相關(guān)的工程文件不要拷入虏杰。
源代碼中不能使用諸如繪圖、Win32API、中斷調(diào)用依溯、硬件操作或與操作系統(tǒng)相關(guān)的API。
允許使用STL類庫(kù)缭乘,但不能使用MFC或ATL等非ANSI c++標(biāo)準(zhǔn)的類庫(kù)。
例如觉壶,不能使用CString類型(屬于MFC類庫(kù))痊末,不能使用randomize, random函數(shù)(不屬于ANSI C++標(biāo)準(zhǔn))
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int peo[30][7];
int temp[7];
int count = 0;
int judge()
{
int min=100,max=0;
for(int i=0;i<7;i++)
{
if(temp[i] == 0)
{
if(min>i)
min = i;
if(max<i)
max = i;
}
}
if((max-min)%6 == 3||(max-min)%6 == 4)
return 1;
else
return 0;
}
int dfs(int depth)
{
if(depth == 7)
{
int num = 0;
for(int i=0;i<7;i++)
{
if(temp[i] == 1)
{
num++;
}
}
if(num == 5)
{
// *peo[count] = *temp;
if(judge())
{
memcpy(peo[count],temp,sizeof(temp));
count++;
}
}
}
else
{
for(int i=0;i<2;i++)
{
temp[depth] = i;
dfs(depth+1);
}
}
}
int fun(int i,int j,int k,int m,int n)
{
int count = 0;
for(int a=0;a<7;a++)
{
if(peo[i][a]+peo[j][a]+peo[k][a]+peo[m][a]+peo[n][a]==5)
{
count++;
}
}
if(count>=3)
return 1;
else
return 0;
}
int funa(int i,int j,int k,int m)
{
int count = 0;
for(int a=0;a<7;a++)
{
if(peo[i][a]+peo[j][a]+peo[k][a]+peo[m][a] >=2)
{
count++;
}
}
if(count >= 7)
{
return 1;
}
else
{
return 0;
}
}
int funb(int i,int k)
{
int count = 0;
for(int a=0;a<7;a++)
{
if(peo[i][a]+peo[k][a] == 2)
{
count++;
}
}
if(count>=4)
{
return 1;
}
else
return 0;
}
void func(int i)
{
for(int a=0;a<7;a++)
{
cout<<peo[i][a]<<" ";
}
cout<<endl;
}
int main()
{
dfs(0);
for(int i=0;i<count;i++)
{
for(int j=0;j<count;j++)
{
for(int k=0;k<count;k++)
{
for(int m=0;m<count;m++)
{
for(int n=0;n<count;n++)
{
if(fun(i,j,k,m,n))
{
if(funa(i,j,k,m))
{
if(peo[j][6]+peo[m][6]+peo[n][6] == 0)
{
if(peo[i][2] + peo[n][2] == 2)
{
if(funb(i,k))
{
func(i);
func(j);
func(k);
func(m);
func(n);
//cout<<"================================================================="<<endl;
cout<<endl;
}
}
}
}
}
}
}
}
}
}
}