测试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
",a[i][n]);
  }
  for (i=1;i<n;i++) printf("%d ",a[n][i]);
  printf("%d",a[n][n]);
  //return 0;
}
原文地址:https://www.cnblogs.com/dancer16/p/6873288.html