1. 程式人生 > >百練2811--熄燈問題

百練2811--熄燈問題

n) ++ printf cpp clas esp blank 數組 light

題目陳述

這道題乍一看不會做,但聽完老師的思路就變得很簡單:

雖然情況很多似乎列舉不完,但是我們可以只列舉第一行的所有情況,然後推出後面的所有情況,這下這道題就有了思路

我自己寫的時候沒有用到下面這兩句代碼(也即在完整代碼中高亮標記的那兩句)

press[i+1][l]=(press[i-1][l]+press[i][l-1]+press[i][l]+press[i][l+1]+light[i][l])%2;

if ((press[5][c-1]+press[5][c]+press[5][c+1]+press[4][c])%2 != puzzle[5][c]);

這兩句代碼非常巧妙,我感覺算是神來之筆~

我自己寫的時候寫了一個change函數,專門來改變puzzle數組的值,但是這樣子做程序得不出結果,原因暫時沒有發現..

於是在網上找到了原本代碼,經過修改使其簡潔得到如下代碼:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;

#define puzzle light

int light[10][10]={0},press[10][10]={0};

int guess(){
	int i,l;
	for(i=1;i<=4;i++)
		for(l=1;l<=6;l++){
			press[i+1][l]=(press[i-1][l]+press[i][l-1]+press[i][l]+press[i][l+1]+light[i][l])%2;
} for(int c=1; c<7; c++) { if ((press[5][c-1]+press[5][c]+press[5][c+1]+press[4][c])%2 != puzzle[5][c]) return 0; } return 1; } int main(){ // freopen("in.txt","r",stdin); int c; for(int i=1;i<=5;i++) for(int l=1;l<=6;l++) scanf("%d",&light[i][l]); for(int i=1;i<=6;i++){ press[1][i]=0; } while(!guess()){ press[1][1]++; c=1; while(press[1][c]>1){ press[1][c]=0; c++; press[1][c]++; } } for(int i=1;i<=5;i++) for(int l=1;l<=6;l++){ if(l!=6) printf("%d ",press[i][l]); else if(i!=5) printf("%d\n",press[i][l]); else printf("%d",press[i][l]); } return 0; }

  

百練2811--熄燈問題