問題描述:
在一個2k×2k(k≥0)個方格組成的棋盤中,恰有一個方格與其他方格不同,稱該方格爲特殊方格。顯然,特殊方格在棋盤中出現的位置有4k中情形,因而有4k中不同的棋盤,圖(a)所示是k=2時16種棋盤中的一個。棋盤覆蓋問題要求用圖(b)所示的4中不同形狀的L型骨牌覆蓋給定棋盤上除特殊方格以外的所有方格,且熱河亮哥L型骨牌不得重複覆蓋
。
設計如圖
該pdf文檔已上傳,需要就直接下載
完整代碼
//author:rgh
#include <stdio.h>
#include <math.h>
int tile=1; //記錄骨牌的型號
int board[20][20]={0}; //存儲棋盤被覆蓋的情況
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{ //tr和tc是棋盤左上角的下標,dr和dc是特殊方格的下標,size是棋盤的大小
int t=0;
int s;
if (size==1)return;
t=tile++;
s=size/2; //劃分棋盤
//覆蓋左上角棋盤
if (dr<tr+s&&dc<tc+s) //特殊方格在棋盤的左上角
ChessBoard(tr,tc,dr,dc,s);
else
{
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
{
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
{
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
{
board[tr+s][tc+s]=t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
int main()
{
int k,x,y;
printf("請輸入棋盤的規模K:");
scanf("%d",&k);
printf("請輸入特殊方格的下標x,y:");
scanf("%d %d",&x,&y);
ChessBoard(0,0,x,y,pow(2,k));
for(int i=0; i<pow(2,k); i++)
{
for (int j=0; j<pow(2,k); j++)
{
printf("%-4d",board[i][j]);
}
printf("\n");
}
return 0;
}
有用的話點個贊吧,打賞一下也行,謝謝