第八章棋盘问题

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int maxn=10000;
int board[maxn][maxn];
int k;
int cnt=1;

//左闭右闭区间
void solve(int x1,int x2,int y1,int y2,int m,int n)
{
    //cout<<x1<<" "<<x2<<" "<<y1<<" "<<y2<<endl;

    if(x2-x1==1)
    {
        for(int i=x1;i<=x2;i++)
            for(int j=y1;j<=y2;j++)
                if(board[i][j]==-1) board[i][j]=cnt;

        cnt++;

        return;
    }

    int mx=x1+(x2-x1)/2;
    int my=y1+(y2-y1)/2;

    if(m<=mx && n<=my)
    {
        board[mx+1][my]=board[mx][my+1]=board[mx+1][my+1]=cnt++;

        solve(x1,mx,y1,my,m,n);
        solve(mx+1,x2,my+1,y2,mx+1,my+1);
        solve(x1,mx,my+1,y2,mx,my+1);
        solve(mx+1,x2,y1,my,mx+1,my);
    }

    if(m>mx && n<=my)
    {
        board[mx][my]=board[mx][my+1]=board[mx+1][my+1]=cnt++;

        solve(x1,mx,y1,my,mx,my);
        solve(mx+1,x2,my+1,y2,mx+1,my+1);
        solve(x1,mx,my+1,y2,mx,my+1);
        solve(mx+1,x2,y1,my,m,n);
    }

    if(m<=mx && n>my)
    {
        board[mx+1][my]=board[mx][my]=board[mx+1][my+1]=cnt++;

        solve(x1,mx,y1,my,mx,my);
        solve(mx+1,x2,my+1,y2,mx+1,my+1);
        solve(x1,mx,my+1,y2,m,n);
        solve(mx+1,x2,y1,my,mx+1,my);
    }

    if(m>mx && n>my)
    {
        board[mx+1][my]=board[mx][my]=board[mx][my+1]=cnt++;

        solve(x1,mx,y1,my,mx,my);
        solve(mx+1,x2,my+1,y2,m,n);
        solve(x1,mx,my+1,y2,mx,my+1);
        solve(mx+1,x2,y1,my,mx+1,my);
    }

}

void print_board()
{
    for(int i=0;i<(1<<k);i++)
    {
        for(int j=0;j<(1<<k);j++) printf("%3d ",board[i][j]);
        printf("\n");
    }
}

int main()
{
    memset(board,-1,sizeof(board));
    cin>>k;
    int m,n;
    cin>>m>>n;

    board[m][n]=0;

    solve(0,(1<<k)-1,0,(1<<k)-1,m,n);

    print_board();

    return 0;
}

注意m,n的改变和起始位置和终止位置的改变

时间: 2024-10-29 00:24:35

第八章棋盘问题的相关文章

《Linux内核设计与实现》读书笔记 第十八章 调试

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

棋盘覆盖问题

棋盘覆盖问题       问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目

Q:opencv棋盘标定总是找不到角点

可能是:1.pattern_size没有设置正确(棋盘图片的内角点数目,指除去棋盘边缘的棋盘角点) 2.黑白格,彩格我试了一下不好用 3.内角点的行列数目设置,一定要大于2

计算机算法设计与分析之棋盘覆盖问题

一.引子 最近又重新上了算法课,现在想来有点汗颜,大学期间已经学习了一个学期,到现在却依然感觉只是把老师讲过的题目弄懂了,并没有学到算法的一些好的分析方法和思路,碰到一个新的问题后往往感觉很棘手,痛定思痛之后觉得还是好好再学习一遍,争取能理解透彻每种算法的思路和核心,同时也劝诫各位同行们做事要脚踏实地,不能应付老师的作业,最后吃亏的还是自己啊. 二.棋盘覆盖问题 在一个由2^k *2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘 为一特殊棋盘.现有四种L型骨

棋盘的多米诺覆盖:Dimer Lattice Model,Pfaff 多项式,Kasteleyn 定理

这次来介绍计数组合学里面一个经典的问题:Dimer Lattice Model.问题是这样的:一个有 64 个方格的国际象棋棋盘,有多少种不同的多米诺骨牌覆盖?这里的覆盖是指不重复不遗漏地盖住整个棋盘. 下图是一种可能的覆盖方式(图片来自 Wiki 百科): 这个问题的答案是 12988816,非常大的一个数字,绝对不是一个一个数出来的.1961 年德国物理学家 Kasteleyn 借助于线性代数中的一个结论首先解决了这个问题,我们接下来就介绍他的方法. ~~~~~~~~~~~~~~~~~~~~

nyoj 45 棋盘覆盖

棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求需要类似图2方格总的个数s.如k=1时,s=1;k=2时,s=5 输入 第一行m表示有m组测试数据: 每一组测试数据的第一行有一个整数数k; 输出 输出所需个数s; 样例输入 3 1 2 3 样例输出 1 5 21 /* 注意寻找图中规律

棋盘问题 POJ - 1321

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白

[ZJOI2007]棋盘制作

题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大.

[Codevs] 1014 棋盘染色

1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块.(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接) 输入描述 Input Descri