1. 程式人生 > 其它 >分治演算法-求解棋盤覆蓋問題

分治演算法-求解棋盤覆蓋問題

技術標籤:分治演算法

分治演算法:

2分鐘學會棋盤覆蓋


假設有一個棋盤裡面有一個特殊格子被佔了,現在用L型骨牌去把其他沒有被佔滿的骨牌進行填充。

tr;行數
tc;列數
dr;特殊方格的行數
dc;特殊方格的列數
在這裡插入圖片描述
假設特殊方格在黃色區域,先查詢左上角1/4的方格
填充左上角的右下角方格
填充左上角的右下角方格
在這裡插入圖片描述
填充右上角的方格中的左下角
在這裡插入圖片描述
填充左下角,第一輪填充完成
其他的也是類似填充方式

void CheseBoard(int tr,int tc,int dr,int dc,int size)
{if (size == 1) return ;
 int t = tile++;//用來記錄骨牌的型別的,一個L型骨牌有三個空格可以明顯看到屬於哪一個。
s = size/1;//通過分治演算法每次演算法棋盤的1/4. if(dr < tr + s && dc < tc+s)//也就是特殊方塊現在的位置判斷是不是在左上角 CheassBpard(tr,tc,dr,dc,s);//在先填補其他部分 else {Board[tr+s-1][tc+s-1] = t;//填補右下角 CheassBoard(tr,tc,tr+s-1,tc+s-1,s); } if(dr < tr + s && dc >= tc+s)//也就是特殊方塊現在的位置判斷是不是在右上角 CheassBpard(tr,tc+s,dr,dc,s);
//在先填補其他部分 else {Board[tr+s-1][tc+s] = t;//填補左下角 CheassBoard(tr,tc+s,tr+s-1,tc+s,s); } if(dr >= tr + s && dc < tc+s)//也就是特殊方塊現在的位置判斷是不是在左下角 CheassBpard(tr+s,tc,dr,dc,s);//在先填補其他部分 else {Board[tr+s][tc+s+1] = t;//填補右上角 CheassBoard(tr+s,tc,tr+s,tc+s-1,s); } if(dr >= tr + s && dc >= tc+
s)//也就是特殊方塊現在的位置判斷是不是在右下角 CheassBpard(tr+s,tc+s,dr,dc,s);//在先填補其他部分 else {Board[tr+s][tc+s] = t;//填補左上角 CheassBoard(tr+s,tc+s,tr+s,tc+s,s); }