棋盤覆蓋問題----分治法

參考blog

棋盤覆蓋問題

問題描述

在一個(gè)2^k * 2^k個(gè)方格組成的棋盤中,有一個(gè)方格與其它的不同,若使用以下四種L型骨牌覆蓋除這個(gè)特殊方格的其它方格,如何覆蓋。四個(gè)L型骨牌如下圖:

L型骨牌

棋盤中的特殊方格如圖:

棋盤

????????實(shí)現(xiàn)的基本原理是將 2k x 2k 的棋盤分成四塊 2(k-1) x 2(k-1)的子棋盤,特殊方格一定在其中的一個(gè)子棋盤中,如果特殊方格在某一個(gè)子棋盤中,繼續(xù)遞歸處理這個(gè)子棋盤,直到這個(gè)子棋盤中只有一個(gè)方格為止如果特殊方格不在某一個(gè)子棋盤中,將這個(gè)子棋盤中的相應(yīng)的位置設(shè)為骨牌號(hào),將這個(gè)無特殊方格的了棋盤轉(zhuǎn)換為有特殊方格的子棋盤,然后再遞歸處理這個(gè)子棋盤。以上原理如圖所示:

存在一個(gè)方格

棋盤覆蓋程序如下:

//2d6 棋盤覆蓋問題
#include "stdafx.h"
#include <iostream>     
using namespace std; 

int tile = 1;//全局變量 骨牌編號(hào)
int Board[4][4];//棋盤
void ChessBoard(int tr,int tc,int dr,int dc,int size);

int main()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            Board[i][j] = 0;
        }
    }

    ChessBoard(0,0,2,3,4);

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            cout<<Board[i][j]<<" ";
        }
        cout<<endl;
    }
}

/**
 * tr : 棋盤左上角的行號(hào),tc棋盤左上角的列號(hào)
 * dr : 特殊方格左上角的行號(hào),dc特殊方格左上角的列號(hào)
 * size :size = 2^k 棋盤規(guī)格為2^k*2^k
 */
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
    if(size == 1)
    {
        return;
    }
    int t = tile++;//L型骨牌編號(hào)
    int s = size/2;//分割棋盤

    //覆蓋左上角子棋盤
    if(dr<tr+s && dc<tc+s)//特殊方格在此棋盤中
    {
        ChessBoard(tr,tc,dr,dc,s);
    }
    else//特殊方格不在此棋盤中
    {
        //用編號(hào)為t的骨牌覆蓋右下角
        Board[tr+s-1][tc+s-1] = t;
        //覆蓋其余方格
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
    }

    //覆蓋右上角子棋盤
    if(dr<tr+s && dc>=tc+s)//特殊方格在此棋盤中
    {
        ChessBoard(tr,tc+s,dr,dc,s);
    }
    else//特殊方格不在此棋盤中
    {
        //用編號(hào)為t的骨牌覆蓋左下角
        Board[tr+s-1][tc+s] = t;
        //覆蓋其余方格
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
    }

    //覆蓋左下角子棋盤
    if(dr>=tr+s && dc<tc+s)//特殊方格在此棋盤中
    {
        ChessBoard(tr+s,tc,dr,dc,s);
    }
    else//特殊方格不在此棋盤中
    {
        //用編號(hào)為t的骨牌覆蓋右上角
        Board[tr+s][tc+s-1] = t;
        //覆蓋其余方格
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
    }

    //覆蓋右下角子棋盤
    if(dr>=tr+s && dc>=tc+s)//特殊方格在此棋盤中
    {
        ChessBoard(tr+s,tc+s,dr,dc,s);
    }
    else//特殊方格不在此棋盤中
    {
        //用編號(hào)為t的骨牌覆蓋左上角
        Board[tr+s][tc+s] = t;
        //覆蓋其余方格
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }

}

程序運(yùn)行結(jié)果如下:


輸出結(jié)果

思考

第一步(尋求最小的求解) :

2x2

當(dāng)只有2x2時(shí),剛好一個(gè)L型骨牌 + 特殊方格(任意4個(gè)角都可) 。可是暫時(shí)看不到如何擴(kuò)張,所以得考慮4x4的模型。

4x4

棋盤

1.可以分割成4 個(gè) 2x2,分別為左上角,右上角,左下角和右下角。
2.右上角可以直接用2x2情況求解,可是其他3塊2x2右得按什么 有序步驟 求解?
既然是分治法必然會(huì)用到遞歸,那么大問題必然分解為N個(gè)重復(fù)可解的小問題(當(dāng)然小問題的類型個(gè)數(shù)要可控,一般為1到4個(gè))


數(shù)學(xué)模型:

g(x) = af1(x) + bf2(x) + cf3(x) + df4(x), 其中fi(x)為可解的小問題,a,b,c,d為小問題重復(fù)的次數(shù)


根據(jù)公式,我們可以
1.先找各f(x)
2.將f(x)相加成g(x)


1.現(xiàn)階段我們已經(jīng)分解為2個(gè)小問題:

f1(x) :存在特殊方格的2x2棋盤的求解
f2(x) : 3個(gè)沒有特殊方格的2x2棋盤的求解

  1. 當(dāng)然f1(x)已經(jīng)解決,接著考慮f2(x)。

2.1 考慮f1(x)在4x4的左上角

f2(x)

如圖是f2(x)求解,
f2(x)解步驟 :1.每個(gè)2x2先放一個(gè)L型骨牌(缺口朝向中央,也只能這樣放),2.在中央放一塊L型骨牌(缺口朝向存在特殊方格的2x2棋盤)

2.2 考慮f1(x)在4x4的其他角落塊,同2.1。

第一步 結(jié)尾

那么此時(shí)我們已經(jīng)找到了f(x)并都得到了有序解步驟:
f1(x) :存在特殊方格的2x2棋盤的求解
f2(x) : 3個(gè)沒有特殊方格的2x2棋盤的求解

第二步(組合f(x)來求解g(x)) :

我們將f(x)來接下 8x8時(shí)的情況:
分解成4塊4x4,存在特殊方格的4x4棋盤同第一步分析求解,可是其他3塊4x4不能分解成f2(x) ,所以現(xiàn)在的f1(x) 和f2(x)不滿足,從新第一步,求f(x)

重復(fù)第一步 :

觀察現(xiàn)有的f1(x) 和f2(x)
f1(x) 無法更改
f2(x) 可考慮。同時(shí)在8x8中也是f2(x)不滿足,那么我們得出一套滿足各2k x 2k有序解步驟

其實(shí)有2個(gè)解決口:
1.將f2(x)步驟顛倒試試
2.在2k x 2k中分解的每個(gè)2(k-1) x 2(k-1)棋盤必然應(yīng)該是相同操作的,那么得出每個(gè)2x2棋盤也應(yīng)該是同f1(x),那么就是給沒有特殊方格的2x2棋盤各個(gè)一個(gè)特殊方塊(同時(shí)3個(gè)特殊方塊也可以組成一個(gè)L型骨牌)

新的f(x)
f1(x) :存在特殊方格的2x2棋盤的求解
f2(x) : 3個(gè)沒有特殊方格的2x2棋盤各給一個(gè)特殊方塊(同時(shí)3個(gè)特殊方塊也可以組成一個(gè)L型骨牌),變成f1(x)的求解

f2(x) =f3(x) + 3 *f1(x)

f3(x) : 3個(gè)沒有特殊方格的2x2棋盤各給一個(gè)特殊方塊(同時(shí)3個(gè)特殊方塊也可以組成一個(gè)L型骨牌)

進(jìn)入第二步

進(jìn)行歸納法

先證明4x4依據(jù)2x2可解,再證明2k x 2k 的棋盤依據(jù) 2(k-1) x 2(k-1)的棋盤可解得出f(x)滿足需求

那么遞歸項(xiàng)就是
f1(x) +f2(x) = f1(x) +f3(x) + 3 *f1(x) = f3(x) + 4 * f1(x)
在f1(x) 合并時(shí),要將 f3(x) 提前,因?yàn)橛? *f1(x) 在 f3(x) 后

接下來就可以根據(jù)有序的解步驟寫程序了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • 分治策略 本文包括分治的基本概念二分查找快速排序歸并排序找出偽幣棋盤覆蓋最大子數(shù)組 源碼鏈接:https://gi...
    廖少少閱讀 1,869評(píng)論 0 7
  • Tags: 算法 棋盤覆蓋問題 【問題描述】 在一個(gè)2^k×2^k個(gè)方格組成的棋盤中,若有一個(gè)方格與其他方格不同,...
    zhwhong閱讀 6,285評(píng)論 4 16
  • 機(jī)器學(xué)習(xí)是做NLP和計(jì)算機(jī)視覺這類應(yīng)用算法的基礎(chǔ),雖然現(xiàn)在深度學(xué)習(xí)模型大行其道,但是懂一些傳統(tǒng)算法的原理和它們之間...
    在河之簡(jiǎn)閱讀 20,544評(píng)論 4 65
  • 在最初設(shè)定目標(biāo)的時(shí)候,袁導(dǎo)曾經(jīng)說過:“只要你們願(yuàn)意去拼搏,我陪著你們?nèi)ゴ蚴袌?chǎng),林先生留在家裡講沙龍,提升整體的品質(zhì)...
    粟莎閱讀 136評(píng)論 0 0
  • №1 導(dǎo)語(yǔ)鄉(xiāng)土是中國(guó)基層社會(huì)的代名詞,它意指中國(guó)鋪陳在土地上的廣大農(nóng)村。在傳統(tǒng)中國(guó),農(nóng)村盡管是社會(huì)的基層,卻是整個(gè)...
    冰葉Irene閱讀 5,235評(píng)論 1 10