熄灯问题

POJ1222
这道题知道名字已经很久了,但是每次都是看一半都看不下去了。
让我自己做肯定是做不出来的,现在更是连听别人讲解都听不懂。
这次耐着性子终于听懂了,并且把代码看明白了。
郭炜老师写的代码没看太懂,但是刘家瑛老师写的代码比较容易看懂,B站上有视频。
我放在这里方便以后自己查看。
注意:没行末尾没有多余空格。

#include
#include
using namespace std;
int puzzle[6][8],press[6][8];
bool guess(){
	int r,c;
	for(r=1;r<5;r++){
		for(c=1;c<7;c++){
			press[r+1][c]=((puzzle[r][c]+press[r][c]+press[r][c-1]+press[r][c+1]+press[r-1][c])&1);
		}
	}
	for(c=1;c<7;++c){
		if(((press[5][c-1]+press[5][c]+press[5][c+1]+press[4][c])&1) != puzzle[5][c])
			return false;
	}
	return true;
}
void enumerate(){
	int c;
	for(c=1;c<7;++c)
		press[1][c]=0;
	while(guess()==false){  //手动模拟二进制进位 
		press[1][1]++;
		c=1;
		while(press[1][c]>1){
			press[1][c]=0;
			c++;
			press[1][c]++;
		}
	}
	return; 
}
int main(){
	int cases,i,r,c;
	scanf("%d",&cases);
	for(c=1;c<7;c++){
		press[0][c]=0;
	}
	for(r=0;r<6;r++){
		press[r][0]=press[r][7]=0;
	}
	for(i=0;i<cases;i++){
		for(r=1;r<6;r++){
			for(c=1;c<7;c++){
				scanf("%d",&puzzle[r][c]);
			}
		}
		enumerate();
		printf("PUZZLE #%d\n",i+1);
		for(r=1;r<6;r++){
			for(c=1;c<7;c++)
				printf(c==1?"%d":" %d",press[r][c]);
			printf("\n");
		}
	}
	return 0;
}

你可能感兴趣的:(枚举)