棋盤覆蓋問題

2021-07-11 06:30:20 字數 1571 閱讀 3017

有乙個有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...