P7754 [COCI2012-2013#3] SAHOVNICA 題解
阿新 • • 發佈:2022-01-26
觀前提示:棋盤上的行、一大行都是指的 \(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
各部分已拆解放出。