在一个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
我觉得这个题是真的很坑,因为oj里面的答案是先左上再左下再右上再右下的,而我一直都是先左上再右上的,然后就一直发现答案错误,真的崩溃;
下面这个代码就是可以ac的
而我最开始的写法答案是:
-1 2 3 3
2 2 1 3
4 1 1 5
4 4 5 5
#include<bits/stdc++.h>
using namespace std;
int a[1000][1000];
int tile;
void chess(int tx,int ty,int dx,int dy,int size){
if(size==1)return;
int t=tile++;
int s=size/2;
if(dx<tx+s&&dy<ty+s){ //左上
chess(tx,ty,dx,dy,s);
}
else {
a[tx+s-1][ty+s-1]=t;
chess(tx,ty,tx+s-1,ty+s-1,s);
}
if(dx>=tx+s&&dy<ty+s){//左下
chess(tx+s,ty,dx,dy,s);
}
else{
a[tx+s][ty+s-1]=t;
chess(tx+s,ty,tx+s,ty+s-1,s);
}
if(dx<tx+s&&dy>=ty+s){右上
chess(tx,ty+s,dx,dy,s);
}
else {
a[tx+s-1][ty+s]=t;
chess(tx,ty+s,tx+s-1,ty+s,s);
}
if(dx>=tx+s&&dy>=ty+s){
chess(tx+s,ty+s,dx,dy,s);
}
else{
a[tx+s][ty+s]=t;
chess(tx+s,ty+s,tx+s,ty+s,s);
}
}
int main(){
int n;
while(cin>>n){
tile=1;
int x,y;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
if(a[i][j]==-1){
x=i;
y=j;
}
}
}
chess(0,0,x,y,n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j!=n-1)
cout<<a[i][j]<<" ";
else cout<<a[i][j]<<endl;
}
}
}
return 0;
}