棋盘覆盖问题(分治)

来源:互联网 发布:南京网络品牌推广 编辑:程序博客网 时间:2024/05/22 14:28
#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN=105;int cnt;int mat[MAXN][MAXN];void chessBoard(int tr,int tc,int dr,int dc,int sz){    int s,t;    if(sz==1) return;    s=sz/2;    t=++cnt;    if(dr<tr+s&&dc<tc+s)    {        chessBoard(tr,tc,dr,dc,s);    }else    {        mat[tr+s-1][tc+s-1]=t;        chessBoard(tr,tc,tr+s-1,tc+s-1,s);    }    if(dr<tr+s&&dc>=tc+s)    {        chessBoard(tr,tc+s,dr,dc,s);    }else    {        mat[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,dr,dc,s);    }else    {        mat[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+s,tc+s,dr,dc,s);    }else    {        mat[tr+s][tc+s]=t;        chessBoard(tr+s,tc+s,tr+s,tc+s,s);    }}int main(){    int sz;    int dr,dc;    while(cin>>sz)    {        cin>>dr>>dc;        memset(mat,0,sizeof(mat));        chessBoard(0,0,dr,dc,sz);        cnt=0;        for(int i=0;i<sz;i++)        {            for(int j=0;j<sz;j++)            {                printf("%2d ",mat[i][j]);            }            printf("\n");        }    }    return 0;}
原创粉丝点击