poj 1222 解題報告

解題思路:

這個題目剛開始看到的時候感覺無從下手,因爲這個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");
		}
	 }
	 
}

沒有按照題目的標準格式輸出,懶得修改程序了.哈哈!    感覺程序的代碼質量不是很高,以後會慢慢提高的.很久沒有寫過代碼了..希望我的代碼質量能夠逐漸恢復提高..


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章