棋盤覆蓋之分治加遞迴

2021-10-04 10:19:34 字數 1747 閱讀 5801

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