解題思路:
這個題目剛開始看到的時候感覺無從下手,因爲這個5*6的矩陣,我們不能將它的所有情況全部列舉出來,一共有2的30次方的數據,過於龐大. 但是深入思考一下,其實沒必要列舉那麼多的數據,因爲後面幾行的數據2-5行都是根據第一行的矩陣的值算出來的. 假如這個結果矩陣叫做result[][]. 比如當result第一行的數據是1 0 0 0 0 0 的時候也就是說只按下第一個燈,這個時候第一行和第二行的燈的情況發生了變化.而這個時候我們要確定result的第二行的數據了.那麼該怎麼確定第二行的值呢? 這樣想, 當按照第二行的值進行滅燈的時候一定要將第一行的燈全部滅掉,因爲只有這樣才能確保第一行的燈是全部滅的,第二行以後的數據是對第一行的燈沒有影響的.所以這個時候第一行的亮的所有列對應的第二行的result爲1 只有這樣才能保證第一行的燈全部被滅掉.就這樣一行一行推到第5行. 當第5行的等全部滅掉的時候 第六行的result的值應該是全部爲0的,而如果result第六行的值不是全部爲零,說明就需要藉助第六行的值將第五行的等滅掉,這樣的result的值是錯誤的.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int arr[6][8];
int tmp[6][8];
int result[7][8];
int deal(int n) {
int k;
int i;
int row,col;
int value;
memcpy(tmp,arr,48*sizeof(int));
memset(result,0,56*sizeof(int));
for(k=0;k<6;k++) {
result[1][k+1]=n>>k&1;
}
for(row=1;row<6;row++) {
for(col=1;col<7;col++) {
if(result[row][col]) {
tmp[row][col]=1-tmp[row][col];
tmp[row-1][col]=1-tmp[row-1][col];
tmp[row+1][col]=1-tmp[row+1][col];
tmp[row][col-1]=1-tmp[row][col-1];
tmp[row][col+1]=1-tmp[row][col+1];
}
}
for(i=1;i<7;i++) {
if(tmp[row][i]) result[row+1][i]=1;
else result[row+1][i]=0;
}
}
value=0;
for(i=1;i<7;i++)
value+=result[6][i];
return !value;
}
int main() {
int n;
int i,j;
scanf("%d",&n);
while(n--) {
memset(arr,0,48*sizeof(int));
memset(result,0,56*sizeof(int));
for(i=1;i<6;i++)
scanf("%d %d %d %d %d %d",&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4],&arr[i][5],&arr[i][6]);
for(i=1;i<64;i++) {
if(i==9) continue;
if(deal(i)) break;
}
if(i==64) {
printf("there is no answer\n");
return 0;
}
for(i=1;i<=5;i++) {
for(j=1;j<=6;j++)
printf("%d ",result[i][j]);
printf("\n");
}
}
}
沒有按照題目的標準格式輸出,懶得修改程序了.哈哈! 感覺程序的代碼質量不是很高,以後會慢慢提高的.很久沒有寫過代碼了..希望我的代碼質量能夠逐漸恢復提高..