用分治法求解棋盤覆蓋問題-算法設計與分析報告C/C++版

問題描述:

在一個2k×2k(k≥0)個方格組成的棋盤中,恰有一個方格與其他方格不同,稱該方格爲特殊方格。顯然,特殊方格在棋盤中出現的位置有4k中情形,因而有4k中不同的棋盤,圖(a)所示是k=216種棋盤中的一個。棋盤覆蓋問題要求用圖(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;
}

有用的話點個贊吧,打賞一下也行,謝謝 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章