問題 C: 棋盤覆蓋問題

題目描述

在一個n×n (n = 2k)個方格組成的棋盤中,恰有一個方格與其他方格不同,稱該方格爲一特殊方格,且稱該棋盤爲一特殊棋盤。
在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。

輸入

多組測試用例,每組測試用例包括兩部分,
第一部分爲方格的寬度n,
第二部分則爲方格,特殊方格爲-1,其他方格爲0。

輸出

輸出覆蓋後的方案

樣例輸入 Copy

4
-1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

樣例輸出 Copy

-1 2 4 4
2 2 1 4
3 1 1 5
3 3 5 5

#include<iostream>

using namespace std;

	int tie=1;
	int board[100][100]={0};
	
void chessBoard(int tr,int tc,int dr,int dc,int size){//定義起始位置的行和列,特殊位置的行和列以及整個棋盤的長度; 
	if(size==1)
		return ;//如果棋盤長度爲1就直接返回; 
	int t=tie++;//定義L型骨牌號碼; 
	int 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;//用t號L型骨牌覆蓋右下角; 
		chessBoard(tr,tc,tr+s-1,tc+s-1,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,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+s,dr,dc,s);
	}else{
		board[tr+s][tc+s]=t;
		chessBoard(tr+s,tc+s,tr+s,tc+s,s);
	}
	
}

int main(){
	int n ;
	while(cin>>n){
		int dr,dc;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				cin>>board[i][j];
				if(board[i][j]!=0){
					dr=i;
					dc=j;
				}
			}
		}
		chessBoard(0,0,dr,dc,n);
		for(int k=0;k<n;k++){
			for(int m=0;m<n;m++){
				cout<<board[k][m]<<" ";
			}
			cout<<endl;
		}
		tie=1;
	}
	
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章