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

zola_P發表於2020-12-27

分治演算法:

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);
}

相關文章