/**
* poj1176 枚举
* 我想这个题的本意应该是DFS,但因题义有限制,所以一共就8种情况,枚举就行了,实在不必费力DFS
* 首先,我们只看前6个灯的状态就可以了,剩下的都是以6为模重复的
* 然后,4个操作都是2元的,也就是说只有奇数次和偶数次操作,而且连续两次相同操作之后,结果是一样的
* 4个2元操作最多有16种结果,但实际上,可能出现的6灯状态只有8种,我们只要按需遍历这八个可能的6灯序列就可以了
* 遍历的时候,每个序列都检查一下是否符合最后的开灯关灯要求,再检查一下是否能在给出的次数内解决问题,我们用availflag[i][j]判断第i个序列能否用j次操作完成
* availflag的值画一下就可以了,值得注意的是,这8个序列都可以以>=4的操作次数完成,因此只需要标记前4次操作(其实3次就可以)就够了
*/
#include <cstdio>
using namespace std;
char output[8][6] = {
'0','0','0','0','0','0',
'0','0','1','1','1','0',
'0','1','0','1','0','1',
'0','1','1','0','1','1',
'1','0','0','1','0','0',
'1','0','1','0','1','0',
'1','1','0','0','0','1',
'1','1','1','1','1','1'};
bool availflag[8][4] = {
0,1,1,1,
0,0,1,1,
0,1,1,1,
0,1,0,1,
0,0,1,1,
0,1,1,1,
0,0,1,1,
1,0,1,1
};
int onlamp[3],offlamp[3];
int main(){
int n,c;
scanf("%d%d",&n,&c);
for(int i=0;i<3;++i){
scanf("%d",&onlamp[i]);
if(onlamp[i] == -1){
break;
}
}
for(int i=0;i<3;++i){
scanf("%d",&offlamp[i]);
if(offlamp[i] == -1){
break;
}
}
for(int i=0;i<8;++i){
//检查指定位要求
bool validflag = true;
for(int j=0;onlamp[j]!=-1;++j){
if(output[i][(onlamp[j]-1)%6] == '0'){
validflag = false;
}
}
for(int j=0;offlamp[j]!=-1;++j){
if(output[i][(offlamp[j]-1)%6] == '1'){
validflag = false;
}
}
if(validflag){
//检查操作目标是否可达
bool aflag = (c>=4) ? true : availflag[i][c];
if(aflag){
for(int j=0;j<n;++j){
printf("%c",output[i][j%6]);
}
printf("\n");
}
}
}
return 0;
}
poj1176 枚举
最新推荐文章于 2020-12-05 16:29:30 发布