计蒜客-棋盘覆盖(循环输入)

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

在棋盘覆盖问题中,要用如下四种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。易知,在任何一个2^k * 2^k的批判覆盖中,用到的L型骨牌个数恰好为((4^k) -1) / 3。

输入格式:

多组测试样例。每组测试样例给定k(1≤k≤10)、x、 y,代表这是一个(2^k)×(2^k)的棋盘,x和y代表特殊方格的位置(坐标从0开始)。

输出格式:

对于每组测试样例,输出你设计的棋盘。给每个骨牌编号(编号从1 到((4^k)-1)/3,特殊方格用0编号)。若有多种方案,请任意输出一种即可。

样例输入
2 0 1
样例输出
2 0 3 3
2 2 1 3
4 1 1 5
4 4 5 5


#include<iostream>
#include <cstdio>
using namespace std;
int board[1025][1025];
static int tile=1;
void chessb(int tr,int tc,int dr,int dc,int si)
{
    if(si==1)return;
    int t=tile++;
    int s=si/2;
    if(dr<tr+s&&dc<tc+s)chessb(tr,tc,dr,dc,s);
    else
    {
        board[tr+s-1][tc+s-1]=t;
        chessb(tr,tc,tr+s-1,tc+s-1,s);
    }
    if(dr<tr+s&&dc>=tc+s)chessb(tr,tc+s,dr,dc,s);
    else
    {
        board[tr+s-1][tc+s]=t;
        chessb(tr,tc+s,tr+s-1,tc+s,s);
    }
    if(dr>=tr+s&&dc<tc+s)chessb(tr+s,tc,dr,dc,s);
    else
    {
        board[tr+s][tc+s-1]=t;
        chessb(tr+s,tc,tr+s,tc+s-1,s);
    }
    if(dr>=tr+s&&dc>=tc+s)chessb(tr+s,tc+s,dr,dc,s);
    else
    {
        board[tr+s][tc+s]=t;
        chessb(tr+s,tc+s,tr+s,tc+s,s);
    }
}
int main()
{
    int k,x,y;
   while(cin>>k)
   {
       tile=1;//!防止循环输入时参数改变,导致提交错误
       int s = 1<<k;
   cin>>x>>y;
       board[x][y]=0;
        chessb(0,0,x,y,s);
        for(int i=0;i<s;i++)
        {
            for(int j=0;j<s;j++)
                cout<<board[i][j]<<' ';
            cout<<endl;
        }
   }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值