美文网首页
棋盘问题的递归解决

棋盘问题的递归解决

作者: 尹傲雄 | 来源:发表于2017-05-24 14:28 被阅读121次

具体的题目是:
有一个 的方格棋盘,恰有一个方格是黑色的,其它为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑方格不能被覆盖,且任意一个白色方格不能同时被两个或者多个L型牌覆盖。如图为L型牌的4种旋转方式。


4种方式4种方式

问题分析:
我们很容易想到用递归的方法去解决这个问题,在经典的递归问题汉诺塔问题中我们,把N个盘子的问题分解成N-1个问题去递归解决。那么我们也可以往这方面想,这个棋盘规格是2k*2K,那么我们可以将k减去1,将大棋盘分成小棋盘来解决。于是大棋盘被分成了四个小棋盘,可是新的问题来了,虽然把棋盘分解了可是只有一个棋盘里是有黑块的,这样没法进行递归。既然没有那么我们就想办法给它添上,而且每分一次就添一次,保证递归的进行。问题的关键是怎么添,添在哪里?根据这个L形的形状,可以在分割的中心的添上一个L形。如图所示:

这里写图片描述这里写图片描述
然后递归就可以顺利的进行了。总结一下过程:
  1. 递归的结束条件当:k=0时,也就是不在是一个棋盘的时候,可能会有人问问什么不是k=1时,因为k=1时依然需要继续把另外三个地方添上黑块。
  2. 递归关系,将大棋盘分解为小棋盘递归解决。

好了不说了上代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int nCount = 0;
int Matrix[100][100];

void chessBoard(int tr, int tc, int dr, int dc, int size);

int main()
{
    int size, r, c, row, col;
    memset(Matrix, 0, sizeof(Matrix));
    scanf_s("%d", &size);
    scanf_s("%d%d", &row, &col);
    chessBoard(0, 0, row, col, size);

    for (r = 0; r < size; r++)
    {
        for (c = 0; c < size; c++)
        {
            printf("%2d ", Matrix[r][c]);
        }
        printf("\n");
    }

    return 0;
}

void chessBoard(int tr, int tc, int dr, int dc, int size)
{
    int s, t;
    if (1 == size) return;
    s = size / 2;
    t = ++nCount;
    if (dr < tr + s && dc < tc + s)
    {
        chessBoard(tr, tc, dr, dc, s);
    }
    else
    {
        Matrix[tr + s - 1][tc + s - 1] = t;
        chessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
    }

    if (dr < tr + s && dc >= tc + s)
    {
        chessBoard(tr, tc + s, dr, dc, s);
    }
    else
    {
        Matrix[tr + s - 1][tc + s] = t;
        chessBoard(tr, tc + s, tr + s - 1, tc + s, s);
    }
    if (dr >= tr + s && dc < tc + s)
    {
        chessBoard(tr + s, tc, dr, dc, s);
    }
    else
    {
        Matrix[tr + s][tc + s - 1] = t;
        chessBoard(tr + s, tc, tr + s, tc + s - 1, s);
    }
    if (dr >= tr + s && dc >= tc + s)
    {
        chessBoard(tr + s, tc + s, dr, dc, s);
    }
    else
    {
        Matrix[tr + s][tc + s] = t;
        chessBoard(tr + s, tc + s, tr + s, tc + s, s);
    }

}

这是我的一点点理解,有什么不对的请大家批评指正,欢迎评论。

相关文章

  • 棋盘问题的递归解决

    具体的题目是:有一个 的方格棋盘,恰有一个方格是黑色的,其它为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方...

  • 前端开发 -- 算法模式(递归和动态规划)

    递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题,递归通常涉及到函数的自身调用。递归函...

  • 学习递归

    1. 递归 1.1 理解递归 ​ 递归是一种解决问题的方法,它从解决问题的各个小部分中开始,直到解决最...

  • python 基础算法之八皇后问题

    解决思路:递归/回溯 首先是从数据结构的角度考虑如何记录摆放:既然就是棋盘,就很容易想到用二维元祖来解这个问题,但...

  • 递归2--表达式求值

    用递归解决递归形式的问题: 表达式的定义是递归的:

  • 数据结构之理解递归

    理解递归 要理解递归, 首先要理解递归 --佚名 递归是一种解决问题的方法, 他从解决问题的各个小部分开始, 知道...

  • 棋盘覆盖(递归)

    原创 棋盘覆盖问题 算法设计思想: 因为棋盘大小是大小,所以可以进行四等分,即分成左上,右上,左下,右下四个区,而...

  • 递归算法

    递归是解决问题最常用的方法,比如,解决二叉树问题,最容易想到的就是递归算法,首先处理根结点,然后递归处理左右子树。...

  • 动态规划&贪心算法

    动态规划问题,问题可以分为子问题的最优解,从而递归下去。也可以自下而上的循环来解决,就是找到递归的终点,从递归的终...

  • 第二章 递归和回溯

    递归 递归的含义:任何调用自身的函数称为递归。用递归求解问题要点在于递归函数调用自身取解决一个规模比原始问题小一些...

网友评论

      本文标题:棋盘问题的递归解决

      本文链接:https://www.haomeiwen.com/subject/ggfoxxtx.html