四种L型骨牌如图所示。其他问题详见代码注释。
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
int ans[1010][1010];
/*
ans[i][j]:在i,j处放置第ans[i][j]种L型骨牌的种
若ans[i][j]等0表示不放骨牌
*/
void solve(int r,int c,int x,int y,int Size)
{
//处理左上角顶点为(r,c),特殊格坐标为(x,y),棋盘大小为Size*Size的情况
if(Size==2)
{
if(x==r&&y==c)
ans[r+1][c+1]=4;
if(x==r+1&&y==c)
ans[r][c+1]=2;
if(x==r+1&&y==c+1)
ans[r][c]=1;
if(x==r&&y==c+1)
ans[r+1][c]=3;
return ;
}
int t=Size/2;
if(x<r+t&&y<c+t)
{
ans[r+t][c+t]=4;
solve(r,c,x,y,t);
solve(r,c+t,r+t-1,c+t,t);
solve(r+t,c,r+t,c+t-1,t);
solve(r+t,c+t,r+t,c+t,t);
return ;
}
if(x<r+t&&y>=c+t)
{
ans[r+t][c+t-1]=3;
solve(r,c,r+t-1,c+t-1,t);
solve(r,c+t,x,y,t);
solve(r+t,c,r+t,c+t-1,t);
solve(r+t,c+t,r+t,c+t,t);
return ;
}
if(x>=r+t&&y<c+t)
{
ans[r+t-1][c+t]=2;
solve(r,c,r+t-1,c+t-1,t);
solve(r,c+t,r+t-1,c+t,t);
solve(r+t,c,x,y,t);
solve(r+t,c+t,r+t,c+t,t);
return ;
}
if(x>=r+t&&y>=c+t)
{
ans[r+t-1][c+t-1]=1;
solve(r,c,r+t-1,c+t-1,t);
solve(r,c+t,r+t-1,c+t,t);
solve(r+t,c,r+t,c+t-1,t);
solve(r+t,c+t,x,y,t);
return ;
}
}
int main()
{
mem(ans,0);
int n; //棋盘的边长
int x,y; //特殊块的行列(坐标)
scanf("%d%d%d",&n,&x,&y);
solve(1,1,x,y,n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",ans[i][j]);
printf("\n");
}
return 0;
}