• 测试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;
    }
  • 相关阅读:
    ZOJ2402 Lenny's Lucky Lotto List 简单DP
    HDU1024 最大M子段和问题 (单调队列优化)
    HDU2048 HDU2049 组合数系列 错排
    HDU1081 最大字段和 压缩数组(单调队列优化)
    HDU1166 数状数组
    HDU1085 多重背包
    HDU3062
    递归 递推 规律
    【机器学习PAI实战】—— 玩转人工智能之美食推荐
    阿里开源自用 OpenJDK 版本,Java 社区迎来中国力量
  • 原文地址:https://www.cnblogs.com/dancer16/p/6873288.html
Copyright © 2020-2023  润新知