zoukankan      html  css  js  c++  java
  • 棋盘覆盖问题

    在一个由2^k*2^k个方格组成的棋盘中,若恰有一个方格与其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘。

    输入

    输入有多组测试例。

    对每一个测试例有两行,第一行是k(1<=k<=10),第二行是特殊方格所在的位置坐标x,y(0<=x,y<1024)。

    输出

    边长为2^k的方阵,特殊方格的编号为0,所有L形骨牌从1开始连续编号,数据之间的间隔是Tab。

    输入样例

    2

    0 1

    输出样例

    2    0    3    3

    2    2    1    3

    4    1    1    5

    4    4    5    5

    附上代码:

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 int board[1025][1025];  //棋盘
     7 static int tile=1;      //所有L形骨牌从1开始连续编号
     8 
     9 //形参(tr,tc)是棋盘中左上角的方格坐标
    10 //形参(dr,dc)是特殊方格所在的坐标
    11 //形参size是棋盘的行数或列数
    12 void ChessBoard(int tr,int tc,int dr,int dc,int size)
    13 {
    14     if(size==1) return;      //递归边界
    15 
    16     int t=tile++;            //L形骨牌牌号
    17     int s=size/2;            //分割棋盘
    18 
    19     //覆盖左上角子棋盘
    20     if(dr<tr+s&&dc<tc+s)
    21         //特殊方格在此棋盘中
    22         ChessBoard(tr,tc,dr,dc,s);
    23     else
    24     {
    25         //此棋盘中无特殊方格,用t号L形骨牌覆盖右下角
    26         board[tr+s-1][tc+s-1]=t;
    27         //覆盖其余方格
    28         ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
    29     }
    30 
    31     //覆盖右上角子棋盘
    32     if(dr<tr+s&&dc>=tc+s)
    33         //特殊方格在此棋盘中
    34         ChessBoard(tr,tc+s,dr,dc,s);
    35     else
    36     {
    37         //此棋盘中无特殊方格,用t号L形骨牌覆盖左下角
    38         board[tr+s-1][tc+s]=t;
    39         //覆盖其余方格
    40         ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
    41     }
    42 
    43     //覆盖左下角子棋盘
    44     if(dr>=tr+s&&dc<tc+s)
    45         //特殊方格在此棋盘中
    46         ChessBoard(tr+s,tc,dr,dc,s);
    47     else
    48     {
    49         //此棋盘中无特殊方格,用t号L形骨牌覆盖右上角
    50         board[tr+s][tc+s-1]=t;
    51         //覆盖其余方格
    52         ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
    53     }
    54 
    55     //覆盖右下角子棋盘
    56     if(dr>=tr+s&&dc>=tc+s)
    57         //特殊方格在此棋盘中
    58         ChessBoard(tr+s,tc+s,dr,dc,s);
    59     else
    60     {
    61         //此棋盘中无特殊方格,用t号L形骨牌覆盖左上角
    62         board[tr+s][tc+s]=t;
    63         //覆盖其余方格
    64         ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
    65     }
    66 }
    67 
    68 int main()
    69 {
    70     int k,i,j,x,y;
    71     while(~scanf("%d",&k))
    72     {
    73         scanf("%d%d",&x,&y);
    74         k=pow(2,k);
    75         ChessBoard(0,0,x,y,k);
    76         for(i=0; i<k; i++)
    77         {
    78             for(j=0; j<k; j++)
    79                 printf("%d	",board[i][j]);
    80             printf("
    ");
    81         }
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    大数据基础1
    java之MySQL的使用
    java反射
    java多线程
    java异常
    指针综合
    指向函数的指针变量做函数的参数
    指向函数的指针
    字符串指针法赋值
    字符串冒泡排序和折半查找
  • 原文地址:https://www.cnblogs.com/pshw/p/5137130.html
Copyright © 2011-2022 走看看