在乙個n×n (n = 2k)個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。
在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。
當初自己聽了老師說的好久還是不太懂,自己就慢慢琢磨,下面僅僅代表自己的想法
分治與遞迴: 將乙個大的正方形分成4個小正方形,分別為左上角,右上角,左下角,右下角,繼續遞迴分成僅有乙個格仔的正方形,這裡遞迴結束條件是正方形格仔為1,而不是為1時繼續遞迴下去,在這過程中對格仔進行處理,也就是覆蓋,如果特殊方格在這正方形中則繼續遞迴,如果不在則將對比參照的正方形的對角(左下角的對角是右上角)進行覆蓋,構造特殊方格,如此繼續下去。
if條件裡判斷是否在左/右-上/下角正方形中的方法: 每次按照將小塊的正方形的最左上角方格作為元格仔,而if裡面的chek特殊方格位置不變,改變元格仔的位置到小正方形的元格仔進行遞迴
例如:(x1,y1是題目的特殊格仔,x,y是元格仔(每個區域的正方形的第乙個格仔為元格仔))
if
(x1>=x+s&&y1
//左下角
else
當比較特殊格仔是否在左下角時,以左下角黃色格仔中為參照格仔,元格仔加上s要在黃色範圍內,以便確定是否是x+s,或者x+s-1,可以把s看成是乙個數如2進行計算理解
而a陣列是將左下角的紅色格仔進行覆蓋,所以是a[x+s] [y+s-1]
else裡面的chek 引數是將黃色正方形的第乙個格仔作為元格仔,將上一行**覆蓋的格仔作為特殊格仔進行填寫,而s照常
如此進行下去
#include
using
namespace std;
const
int n=
1005
;int a[n]
[n];
int titl=1;
void
chek
(int x,
int y,
int x1,
int y1,
int s2)
if(x1>=x+s&&y1
//左下角
else
if(x1=y+s)
else
if(x1>=x+s&&y1>=y+s)
//右下角
chek
(x+s,y+s,x1,y1,s)
;else
}int
main()
}}chek(0
,0,dx,dy,k)
;for
(int i=
0;i)printf
("\n");
}}return0;
}
棋盤覆蓋 分治和遞迴
棋盤覆蓋問題 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 62,accepted users 26 problem 10432 no special judgement pro...
棋盤覆蓋問題(分治,遞迴)
在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...
分治與遞迴之棋盤覆蓋
棋盤覆蓋問題要求在2 k 2 k 個方格組成的棋盤中,給定任意乙個特殊點,實現對除該特殊點的棋盤實現全覆蓋。如圖所示 如下 include include using namespace std int title 1 設定l型骨牌編號 int board 2049 2049 void chessb...