題目描述
在一個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;
}