分治 問題8 3 1 棋盤覆蓋問題

2021-07-31 09:57:40 字數 1776 閱讀 4150

演算法競賽入門 lrj 棋盤覆蓋問題

在乙個 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 。現給出棋盤的大小和特殊方格所在的位置,請找出這種棋盤。

1 1題解: 2^k * 2^k 的棋盤分割成4個 2^(k-1) * 2^(k-1) 的小棋盤,分別在左上,右上,左下,右下。判斷特殊方格所在的小棋盤,在沒有特殊方格的小棋盤做如下處理:

左上小棋盤: 在其右下角填乙個特殊方格。

右上小棋盤: 在其左下角填乙個特殊方格。

左下小棋盤: 在其右上角填乙個特殊方格。

右下小棋盤: 在其左上角填乙個特殊方格。

沒有特殊方格的三個小棋盤填方格後,其就相當於填乙個l骨牌。

那麼在四個小棋盤中都有乙個特殊方格,問題縮小為:在2^(k-1) * 2^(k-1) 的小棋盤

填l骨牌。

由而分治處理。

#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

#pragma comment(linker, "/stack:102400000,102400000")

const int inf=0x3f3f3f3f;

const int n = 110;

int board[n][n];

int type; // l骨牌的編號

void init()

// br bc 棋盤左上角位置

// x y 特殊方格位置

void slove(int br,int bc,int x,int y,int size)

// 處理右上

if(br+s > x && bc+s <= y) //有特殊方格

slove(br,bc+s,x,y,s);

else //沒有特殊方格

// 處理左下

if(br+s <= x && bc+s > y) //有特殊方格

slove(br+s,bc,x,y,s);

else //沒有特殊方格

// 處理右下

if(br+s <= x && bc+s <= y) //有特殊方格

slove(br+s,bc+s,x,y,s);

else //沒有特殊方格

}int main()

{ init();

int k,x,y;

scanf("%d",&k);

int size = 1<

分治 棋盤覆蓋問題

描述 在乙個2 k 2 k個方格組成的棋盤中,任意存在乙個特殊方格,那麼總有 4 k 1 3個l型骨牌可以將剩餘方格完全覆蓋。分析 將棋盤橫豎四等分,則特殊方格必存在於某一區域。存在特殊方格的區域自然可以完全覆蓋,其餘三個無特殊方格的區域必須去掉乙個方格方可用l型骨牌完全覆蓋。故,將三區域相鄰部分用...

分治法 棋盤覆蓋問題

棋盤覆蓋問題。有乙個2k 2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。分治三步驟 劃分問題 將 2 k 2k 的棋盤劃分為 2 k 1 2k 1...

棋盤覆蓋問題(分治,遞迴)

在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...