棋盤覆蓋問題

2021-08-03 03:54:08 字數 1107 閱讀 4412

演算法描述:在乙個2k×2k 個方格組成的棋盤中,恰有乙個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。

演算法分析:當k>0時,將2

k×2k棋盤分割為4個2

k-1×2

k-1 子棋盤(a)所示。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用乙個l型骨牌覆蓋這3個較小棋盤的會合處,如(b)所示,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。遞迴地使用這種分割,直至棋盤簡化為棋盤1×1。

**如下:

#include #include using namespace std;

int tile = 1;

int **board;

void chessboard(int tr, int tc, int dr, int dc, int size);

//tr棋盤左上角方格的行號,tc棋盤左上角方格的列號,dr特殊方格的行號,dc特殊方格的列號,size當前棋盤的大小

int main()

}while(!(dr <= size && dc <= size));

board = new int *[size];

for (int i=0; i= tc + s)

else

//覆蓋左下角子棋盤

if(dr >= tr + s && dc < tc + s)

else

//覆蓋右下角子棋盤

if(dr >= tr + s && dc >= tc + s)

else

}

執行結果:

棋盤覆蓋問題

source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...

棋盤覆蓋問題

問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...

棋盤覆蓋問題

棋盤覆蓋問題 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 103,accepted users 40 problem 10432 no special judgement pr...