1. 程式人生 > 其它 >P7754 [COCI2012-2013#3] SAHOVNICA 題解

P7754 [COCI2012-2013#3] SAHOVNICA 題解

觀前提示:棋盤上的行、一大行都是指的 \(a\cdot b\cdot c\) 的一行。一小行則是 \(1\cdot c\) 的一行。

思路

先初始化出 \(r\) 個值表示棋盤第 \(r\) 行的開頭顏色,用陣列 \(col\) 進行儲存,\(col_i\) 表示棋盤第 \(i\) 行的開頭顏色。比如 \(col_1\) 是紅色,我們就儲存為 \(0\);比如 \(col_2\) 是白色,就儲存為 \(1\)

然後再按照題意進行模擬即可。可以採用一次構造一小行,再迴圈 \(a\) 次構造棋盤上的一大行,最後迴圈 \(r\) 次構造整個棋盤。

程式碼實現

2.1 初始化

for(int i=1;i<=r;i++){
	if(i%2==1){
		col[i]=0;
	}
	else{
		col[i]=1;
	}
}

通過簡單的找規律,我們發現第一行開頭那個格子一定是紅色,第二行開頭那個格子一定是白色。依次類推很容易得到如果行數 \(\bmod \ 2\)\(1\),那麼開頭一定是紅色。如果行數 \(\bmod \ 2\)\(0\),那麼開頭一定是白色的結論。

我們就可以按照得出的結論初始化 \(col\) 陣列。

2.2 構造棋盤

for(int i=1;i<=r;i++){
	for(int k=1;k<=a;k++){
		f=col[i];
		for(int j=1;j<=c*b;j++){
			if(!f){
				cout<<"X";
			}
        else{
				cout<<".";
			}
			if(j%b==0){
				f=!f;
			}
		}
		cout<<endl;
	}
}

\(f\) 表示當前顏色,如果 \(f=0\) 則輸出X表示紅色區域,反之若 \(f=1\) 輸出.表示白色區域。

注意在輸出一小行之前要將 \(f\) 初始化成 \(col_i\)。並且每輸出完 \(b\) 個字元就要將顏色反過來。

AC Code

各部分已拆解放出。

AC記錄