有乙個有2^k×2^k個方格的棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是
用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖(1)所示為l型牌的四種旋轉方式。
下圖–圖(1)中的特殊棋盤是當k=3時16個特殊棋盤中的乙個:
圖(1)
輸入格式:
第一行含有三個資料:分別為n(<=50 <=0 保證是4的倍數):棋盤邊長,x(<=n >=1):特殊方格橫座標,y(<=n >=1):特殊方格縱座標。
輸入樣例:
8 5 6
輸出樣例:
4 4 5 5 9 9 10 10
4 2 2 5 9 7 7 10
6 2 0 3 8 8 7 11
6 6 3 3 1 8 11 11
14 14 13 1 1 18 19 19
14 12 13 13 18 18 17 19
15 12 12 16 20 17 17 21
15 15 16 16 20 20 21 21
本題解題思路:
圖為樣例輸入
先將棋盤分割成四個子棋盤,再將沒有特殊方格的子棋盤的靠近分割點的三格覆蓋骨牌。
將子棋盤再分割成四個更小的子棋盤,並按照之前的方法,將黃色格仔當做特殊格仔,實現分治,將沒有特殊方格的子棋盤的靠近中心分割點的三格覆蓋骨牌。
子棋盤為2×2時填充剩下的格仔便完成了。
**如下:
#includeusing namespace std;
int x,y,n,i,j,t=0;
//x:特殊格仔橫座標 y:特殊格仔縱座標 n:棋盤邊長 i,j:迴圈變數 t:當前骨牌編號
int map[51][51];
//本程式使用遞迴實現分治.
void cb(int x,int y,int m,int n,int s)
//x:棋盤左上角橫座標 y:棋盤左上角縱座標 m:特殊格仔橫座標 n:特殊格仔縱座標 s:棋盤邊長
t++;
sa=s/2;
if(m=y+sa) //特殊格仔在右上角
if(m>=x+sa && n=x+sa && n>=y+sa) //特殊格仔在右下角
}int main()
return 0;
}
棋盤覆蓋問題
source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...
棋盤覆蓋問題
問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...
棋盤覆蓋問題
棋盤覆蓋問題 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 103,accepted users 40 problem 10432 no special judgement pr...