棋盘覆盖问题

来源:互联网 发布:phpmyadmin同步数据库 编辑:程序博客网 时间:2024/06/05 15:11

题意:

        经典棋盘覆盖问题

代码:

#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();    }}


原创粉丝点击