测试2T1
问题 A: 棋盘覆盖问题
时间限制: 1 Sec 内存限制: 128 MB提交: - 解决: -
[提交][讨论版]
题目描述
在一个2^k×2^k个方格组成的棋盘中恰有一个方格与其它方格不同(图中标记为-1的方格),称之为特殊方格。现用L型(占3个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是(4^k-1)/3。在下表给出的一个覆盖方案中,k=2,相同的3各数字构成一个纸片。
下面使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。输出最后的棋盘。
输入
输入文件共2行。
第1行: 一个整数k,表示一个2^k×2^k个方格组成的棋盘。
第2行:两个整数,dr,dc,表示坐标为(dr,dc)的方格为特殊方格。
输出
摆放好数字后的,2^k×2^k个方格组成的棋盘
样例输入
2 2 2
样例输出
2 2 3 3 2 -1 1 3 4 1 1 5 4 4 5 5
提示
【数据范围】
50%的数据k<=5。
100%的数据
分治思想-将与问题分解成规模更小,形式相同的子问题
把棋盘分成上下左右四部分,中间除了原来那块再构造出一个L行
分治每一块
#include<cstdio> int n,sum,a[1100][1100]; void g(int x1,int y1,int x2,int y2,int xx,int yy){ int i,j,mix,miy,sum2; if ((x2-x1==1)&&(y2-y1==1)){ sum++; for (i=x1;i<=x2;i++) for (j=y1;j<=y2;j++) if (a[i][j]==0) a[i][j]=sum; return; } mix=(x2+x1)>>1; miy=(y2+y1)>>1; sum++; sum2=sum; if (xx<=mix&&yy<=miy) g(x1,y1,mix,miy,xx,yy); else {a[mix][miy]=sum2; g(x1,y1,mix,miy,mix,miy);} if (xx<=mix&&yy>miy) g(x1,miy+1,mix,y2,xx,yy); else {a[mix][miy+1]=sum2; g(x1,miy+1,mix,y2,mix,miy+1);} if (xx>mix&&yy<=miy) g(mix+1,y1,x2,miy,xx,yy); else {a[mix+1][miy]=sum2; g(mix+1,y1,x2,miy,mix+1,miy);} if (xx>mix&&yy>miy) g(mix+1,miy+1,x2,y2,xx,yy); else {a[mix+1][miy+1]=sum2; g(mix+1,miy+1,x2,y2,mix+1,miy+1);} } int main(){//freopen("chess.in","r",stdin); //freopen("chess.out","w",stdout); int x,y,i,j; scanf("%d%d%d",&n,&x,&y); a[x][y]=-1; n=1<<n; sum=0; g(1,1,n,n,x,y); for (i=1;i<n;i++){ for (j=1;j<n;j++) printf("%d ",a[i][j]); printf("%d\n",a[i][n]); } for (i=1;i<n;i++) printf("%d ",a[n][i]); printf("%d",a[n][n]); //return 0; }