分治 棋盤覆蓋

2021-08-02 07:57:35 字數 1181 閱讀 6681

題目描述

在乙個2^k * 2^k個方格組成的棋盤中,若恰有乙個方格與其它方格不同,則稱該方格為一特殊方格,稱改棋盤為一特殊棋盤。顯然特殊方格在棋盤上出現的位置有4^k種情形。因而對任何k>=0,有4^k種不同的特殊棋盤。下圖所示的特殊棋盤為k=2時16個特殊棋盤中的乙個。

在棋盤覆蓋問題中,要用下圖中4中不同形態的l型骨牌覆蓋乙個給定的特殊棋牌上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。易知,在任何乙個2^k * 2^k的棋盤中,用到的l型骨牌個數恰為(4^k-1)/3。

輸入 輸入正方形的變成n,n一定是2的整數次冪,另外還有兩個數是特殊方格的位置

輸出 輸出擺放的方案,特殊方格用0表示,兩個整數之間用乙個空格隔開,行末沒有空格。

注意,要按照從上到下,從左到右的順序依次給他們編號,具體見樣例

樣例輸入

4 1 1

樣例輸出

0 1 2 2

1 1 3 2

4 3 3 5

4 4 5 5

提示 n小於100

很經典的例題對不對;

其實我們遞迴分治就好了;

對於乙個正方形,裡面有乙個點空缺;

那麼我們把正方形一半一半,分成4份;

其中有乙份就是有個空缺的;

那我們把另外三份的交接點上放乙個l型的塊;

這樣的話洗個小正方形都有乙個空缺,直接遞迴

#include

#define ll long long

using namespace std;

const int n=1e2+5;

int a[n][n],ll;

int n,x,y;

void dfs(int

x,int xx,int

y,int yy,int x,int y,int z)

void dfs(int i,int j,int z)

int main()

printf("\n");}}

有人寫的**竟然比我短,我靠

棋盤覆蓋 分治

問題描述 在乙個2 k 2 k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有 4 k種,因而有 4 k種不同的棋盤,圖 a 所示是 k 2時 16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖 b ...

棋盤覆蓋 分治

include pch.h include iostream using namespace std 棋盤問題,分治演算法 int q 1024 1024 棋盤陣列,全域性變數 static int tile 1 骨牌編號 tr 棋盤左上角行數,tc 棋盤左上角列數,dr 特殊方格所在行數,dc 特...

分治法,棋盤覆蓋

分治法 棋盤覆蓋問題 問題描述 在乙個2k x 2k 即 2 k x 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用4不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。思想 將...