马走日 DFS c++ 算法解答

   日期:2020-05-29     浏览:178    评论:0    
核心提示:题目:假设国际象棋棋盘有5*5共25个格子。设计一个程序,使棋子从初始位置(如图)开始跳马,需要将棋盘的格子全部都走一遍,每个格子只允许走一次。问:总共有多少解。思路:DFS:将起点作为搜索的起点,然后枚举马的八个走向,由于不是每个马都有八个走向,所以每走一步就要判断有没有越界,如果没有,就将当前点做为新的起点,然后继续递归走下一步,并把走过的地方标记为true,直到走到无路可走就结束递归,并且步数等于24时意味着遍历了所有格子(以(0,0)为起点),方案数加1。#include

题目
假设国际象棋棋盘有5*5共25个格子。设计一个程序,使棋子从初始位置开始跳马,需要将棋盘的格子全部都走一遍,每个格子只允许走一次。

:总共有多少解。

思路
DFS:
将起点作为搜索的起点,然后枚举马的八个走向,由于不是每个马都有八个走向,所以每走一步就要判断有没有越界,如果没有,就将当前点做为新的起点,然后继续递归走下一步,并把走过的地方标记为true,直到走到无路可走就结束递归,并且步数等于24时意味着遍历了所有格子(以(0,0)为起点),方案数加1。

ps: 总共有25个格子,sign[0][0] == true,只剩下24个格子,所以等 steps == 24 时相当于遍历结束。

#include<iostream>
#include<algorithm>

bool sign[5][5];
static int method = 0;
int dx[] = {-2,-2,-1,-1,1,1,2,2};
int dy[] = {1,-1,2,-2,2,-2,1,-1};

bool check_boundary(int x, int y)
{
        if(sign[x][y] == true) //note1
                return false;
        if(x>=5 || x<0 || y<0 || y>=5)
                return false;

        return true;
}

void dfs(int steps, int x, int y)
{
        if(steps == 24)
        {
                method++;
                return;
        }
        // Judge boundary 
        for(int i = 0; i <= 7; i++)
        {
                int m = x + dx[i];
                int n = y + dy[i];

                if( check_boundary(m ,n) )
                {
                        sign[m][n] = true; //mark: this grid has been covered
                        dfs(steps+1, m, n);
                        sign[m][n] = false;
                }
        }
}

int main()
{
        sign[0][0] = true;
        dfs(0,0,0);
        std::cout <<"total methods:" << method << std::endl;
}

result:total methods --> 304

  • 分享一个coding时遇到的小bug,希望大家不要像我一样粗心!源码中 note1的位置应该是 sign[x][y] == true;而不是sign[x][y] = true;噢!

以下是这个bug的结果:

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服