• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70  文章 - 160  trackbacks - 0

            公告:
            知識(shí)共享許可協(xié)議
            本博客采用知識(shí)共享署名 2.5 中國(guó)大陸許可協(xié)議進(jìn)行許可。本博客版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不得隨機(jī)刪除文章任何內(nèi)容,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。 具體操作方式可參考此處。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)給我留言。

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 178988
            • 排名 - 147

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            雖然這個(gè)問(wèn)題已經(jīng)在網(wǎng)上被討論遍了,但是最近從新拾起算法,感覺(jué)有必要夯實(shí)一下基礎(chǔ)。

            棋盤覆蓋問(wèn)題
            首先大致描述一下題目
            在一個(gè)2^k×2^k個(gè)方格組成的棋盤中,若有一個(gè)方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為一個(gè)特殊棋盤.顯然特殊方格在棋盤上出現(xiàn)的位置有4^k種情形.因而對(duì)任何
            k≥0,有4^k種不同的特殊棋盤.
            下圖–圖(1)中的特殊棋盤是當(dāng)k=2時(shí)16個(gè)特殊棋盤中的一個(gè):

             

            圖(1)

            題目要求在棋盤覆蓋問(wèn)題中,要用下圖—圖(2)所示的4種不同形態(tài)的L型骨牌覆蓋一個(gè)給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個(gè)L型骨牌不得重疊覆蓋.

             

            圖(2)

            思路分析:
            當(dāng)k>0時(shí),將2^k×2^k棋盤分割為4個(gè)2^k-1×2^k-1子棋盤,如下圖–圖(3)所示:


             

            圖(3)

            特殊方格必位于4個(gè)較小子棋盤之一中,其余3個(gè)子棋盤中無(wú)特殊方格.為了將這3個(gè)無(wú)特殊方格的子棋盤轉(zhuǎn)化為特殊棋盤,可以用一個(gè)L型骨牌覆蓋這3個(gè)較小棋盤的會(huì)合處。
            如下圖–圖(4)所示,這3個(gè)子棋盤上被L型骨牌覆蓋的方格就成為該棋盤上的特殊方格,從而原問(wèn)題轉(zhuǎn)化為4個(gè)較小規(guī)模的棋盤覆蓋問(wèn)題.遞歸地使用這種分割,直至棋盤簡(jiǎn)化為1×1棋盤。

            以下是代碼:

             

            /*
            Author: Tanky Woo
            Blog:   www.WuTianQi.com
            棋盤覆蓋問(wèn)題
            分治法
            2010-12-3
            */
            #include 
            <iostream>
            using namespace std;
            const int N = 11;
            int Board[N][N];
            int tile = 0;
             
            /*
            tr:棋盤左上角方格的行號(hào)
            tc:棋盤左上角方格的列號(hào)
            dr:特殊方格所在的行號(hào)
            dc:特殊方格所在的列號(hào)
            size:方形棋盤的邊長(zhǎng)
            */
            void ChessBoard(int tr, int tc, int dr, int dc, int size)
            {
                
            if(size == 1)
                    
            return;
                
            int t = ++tile, s = size/2;
             
                
            //覆蓋左上角子棋盤
                if(dr<tr+&& dc<tc+s)
                    
            //特殊方格在此棋盤中
                    ChessBoard(tr, tc, dr, dc, s);
                
            else   // 此棋盤無(wú)特殊方格
                {
                    
            // 用t號(hào)L型骨型牌覆蓋右下角
                    Board[tr+s-1][tc+s-1= t;
                    
            // 覆蓋其余方格
                    ChessBoard(tr, tc, tr+s-1, tc+s-1, s);
                }
             
                
            //覆蓋右上角子棋盤
                if(dr<tr+&& dc>=tc+s)
                    ChessBoard(tr, tc
            +s, dr, dc, s);
                
            else
                {
                    Board[tr
            +s-1][tc+s] = t;
                    ChessBoard(tr, tc
            +s, tr+s-1, tc+s, s);
                }
             
                
            //覆蓋左下角子棋盤
                if(dr>=tr+&& dc<tc+s)
                    ChessBoard(tr
            +s, tc, dr, dc, s);
                
            else
                {
                    Board[tr
            +s][tc+s-1= t;
                    ChessBoard(tr
            +s, tc, tr+s, tc+s-1, s);
                }
             
                
            //覆蓋右下角子棋盤
                if(dr>=tr+&& dc>=tc+s)
                    ChessBoard(tr
            +s, tc+s, dr, dc, s);
                
            else
                {
                    Board[tr
            +s][tc+s] = t;
                    ChessBoard(tr
            +s, tc+s, tr+s, tc+s, s);
                }
            }
             
            void DisplayBoard(int size)
            {
                
            for(int i=1; i<=size; ++i)
                {
                    
            for(int j=1; j<=size; ++j)
                        printf(
            "%2d ", Board[i][j]);
                    printf(
            "\n");
                }
            }
             
            int main()
            {
                ChessBoard(
            11124);
                DisplayBoard(
            4);
                
            return 0;
            }
            posted on 2010-12-08 10:23 Tanky Woo 閱讀(3924) 評(píng)論(7)  編輯 收藏 引用

            FeedBack:
            # re: 棋盤覆蓋問(wèn)題 2010-12-08 11:52 tiny
            goodjob
              回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2010-12-09 00:18 曹小天
            這代碼是你自己寫的嗎?我在百度文庫(kù)上看見(jiàn)《(棋盤覆蓋)實(shí)驗(yàn)報(bào)告》上的代碼核心部分和你的一摸一樣,你的只不過(guò)多了輸出 結(jié)果罷了。你的問(wèn)題解析也和那也是字字不差。  回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2010-12-13 11:45 crossgate
            解決思路很有啟發(fā)性。困難的問(wèn)題通過(guò)層層分解,最后都成為簡(jiǎn)單的問(wèn)題。

              回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2010-12-13 11:49 Tanky Woo
            @曹小天
            你好,無(wú)論是你在百度文庫(kù)上看到的,還是在我這看到的,來(lái)源都是王曉東的《計(jì)算機(jī)算法設(shè)計(jì)與分析(第3版) 》,不過(guò)以上包括代碼(圖片除外),都是我自己打出來(lái)的。  回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2011-09-17 15:38 td
            如何寫動(dòng)態(tài)二維數(shù)組?  回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2012-03-27 21:22 cclive1601
            寫的很好,希望多和你交流,謝謝  回復(fù)  更多評(píng)論
              
            # re: 棋盤覆蓋問(wèn)題 2014-04-08 18:19 bauce
            你好,請(qǐng)問(wèn)為什么當(dāng)棋盤是16*16的時(shí)候得不到正確的結(jié)果,比如有四相同的數(shù)個(gè)在一起

            當(dāng)棋盤是32*32的時(shí)候,返回值不是0,也就是程序沒(méi)有正常結(jié)束  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            996久久国产精品线观看| 99精品国产99久久久久久97| 久久精品中文字幕一区| 精品国产青草久久久久福利| 天天综合久久久网| 久久精品视频网| 久久电影网2021| 91久久精品电影| 久久精品亚洲精品国产欧美| 99久久精品免费观看国产| 国产午夜精品久久久久九九| 久久久久无码精品| 久久久久久国产精品美女| 99久久国产精品免费一区二区 | 女同久久| 久久人人超碰精品CAOPOREN| 伊人 久久 精品| 亚洲国产另类久久久精品| 999久久久免费精品国产| 久久久久久人妻无码| 久久九九有精品国产23百花影院| 精品国产一区二区三区久久久狼| 亚洲AV无码久久| 久久精品国产只有精品2020| 国产国产成人久久精品| 超级碰碰碰碰97久久久久| 国产综合久久久久| 性高朝久久久久久久久久| 热99RE久久精品这里都是精品免费 | 99久久精品免费观看国产| 久久精品无码专区免费 | 久久这里只有精品首页| 精品久久久久久成人AV| 伊人 久久 精品| 香蕉久久一区二区不卡无毒影院| 亚洲色欲久久久久综合网| 人妻丰满AV无码久久不卡| 久久久国产精品| 久久夜色精品国产噜噜噜亚洲AV| 伊人久久大香线蕉成人| 国产精品久久久久国产A级|