题意:
经典棋盘覆盖问题
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=5e3;
int n,posx,posy;
int mp[MAXN][MAXN];
int two[15];
/*
1:
#*
**
2:
**
#*
3:
*#
**
4:
**
*#
*/
void show(){
for(int i=1;i<=two[n];i++){
for(int j=1;j<=two[n];j++)
printf("%3d",mp[i][j]);
puts("");
}
}
void solve(int k,int x,int y,int posx,int posy){
if(k==0) return ;
int midx=x+two[k-1];
int midy=y+two[k-1];
if(posx<midx&&posy<midy){
mp[midx-1][midy]=mp[midx][midy-1]=mp[midx][midy]=1;
solve(k-1,x,y,posx,posy);
solve(k-1,midx,y,midx,midy-1);
solve(k-1,x,midy,midx-1,midy);
solve(k-1,midx,midy,midx,midy);
}else if(posx>=midx&&posy<midy){
mp[midx-1][midy-1]=mp[midx-1][midy]=mp[midx][midy]=2;
solve(k-1,x,y,midx-1,midy-1);
solve(k-1,midx,y,posx,posy);
solve(k-1,x,midy,midx-1,midy);
solve(k-1,midx,midy,midx,midy);
}else if(posx<midx&&posy>=midy){
mp[midx-1][midy-1]=mp[midx][midy-1]=mp[midx][midy]=3;
solve(k-1,x,y,midx-1,midy-1);
solve(k-1,midx,y,midx,midy-1);
solve(k-1,x,midy,posx,posy);
solve(k-1,midx,midy,midx,midy);
}else{
mp[midx-1][midy-1]=mp[midx-1][midy]=mp[midx][midy-1]=4;
solve(k-1,x,y,midx-1,midy-1);
solve(k-1,midx,y,midx,midy-1);
solve(k-1,x,midy,midx-1,midy);
solve(k-1,midx,midy,posx,posy);
}
}
int main()
{
two[0]=1;for(int i=1;i<=12;i++) two[i]=two[i-1]*2;
while(scanf("%d%d%d",&n,&posx,&posy)!=-1){
memset(mp,0,sizeof(mp));
mp[posx][posy]=-1;
solve(n,1,1,posx,posy);
show();
}
}