dfs入门——求解方阵棋盘内两点间的路径条数

dfs入门——求解方阵棋盘内两点间的路径条数

1、情景导入

如果大家下过棋,想必大家都知道“一步三思”的重要性。想要下好一场棋,所做的每一步决策都应得到一个好的考量,而一个好的考量,往往要综合各方面的因素。这其中的因素之一,可行决策方案,便是一个重要的考量点。

可行决策方案,谈到这个名词时还是挺有趣的,因为它和当下很热的一个话题息息相关——人工智能,然而如今人人都知晓的人工智能,我们却对它知之甚少。

百度百科对于人工智能的定义是:人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。

虽然我们人类对于自身智能的理解也是有限的,但就我们目前所知的方面来看,我们人类为实现某一个目标时,会做出各种决策,并最终把实现了目标的决策作为可行的决策之一

比如当你搬家之后,你迷路了,前面有3条路,你并不知道走哪条路才能走到你熟悉的地方。因而你从第1条路开始走,走完之后你发现并没有走到你熟悉的地方,你便原路返回,开始走第2条路,经过了漫长的跋涉后,你终于走到了你熟悉的地方,但聪明的你考虑到以后可能还会经过刚才那个迷路的地方,你思考到:如果第3条路也可以走到熟悉的地方那这条路或许会更近些!于是你便像刚才一样继续原路返回,开始走第3条路,走完之后你果然验证了自己的猜想。因而你总结道从刚才那个迷路的地方走到现在周围熟悉的地方总共有2条路,分别为第2和第3条路,并且第3条路最近。

通过这个简单的例子我们可以发觉,如此具有逻辑性的思想不正是机器可以实现的么,因此计算可行性决决策数量正是计算机可以模仿人类的方面之一, 而且在这个方面从某种程度上说计算机要做得比我们更加出色,我们只需要告诉计算机计算决策数量的步骤,计算机经过高速的运算后便可以高效地得出计算结果。

2、问题描述

现在有一个4×4(4行4列)的方阵棋盘,当前棋盘内只有左上角的一个棋子,规定下一个棋子只能向右、向右下、向下三个方向移动,试求方阵棋盘上从左上角棋子开始下棋至连通右下角棋子的布棋方案数目。

在这里插入图片描述

3、算法思想

为解决这个问题,首先我们需要使用一个二维字符数组chess[4][4]来模拟棋盘,作为我们的操作空间,而为了计算多种可行方案,我们需要再使用一个整型标记数组visit[4][4]来判断当前访问点是否被访问过,数组空间visit[4][4]初值为0,表示未被访问过,设置一个整型变量count来记录可行的方案数目,整型变量count初值为0。

接下来我们需要设计一个函数dfs(int x,int y),两个参数分别作为当前数组操作点的行列坐标,并从点(0,0)开始,每次先判断x和y的值是否合法,有无越界。之后判断visit[x][y]是否为0,为0表示chess[x][y]未被访问,若未被访问,置其为1,表示访问了chess[x][y]。紧接着判断当前x和y的值是否同时达到边界值,如果达到了则令count ++,visit[x][y]=0,回溯至上一步,否则依次执行dfs(x,y+1),dfs(x+1,y+1),dfs(x+1,y),并令visit[x][y]=0,最终输出count的结果。

4、算法源码

ps:为了便于理解,我写了一个打印方法将所有路径打印了出来。

#include<iostream>
#include<cstring>
using namespace std;
const int n = 4;
char chess[n][n];//用于存储棋盘
int visit[n][n];//标记数组
int count = 0;//用于记录可行性方案 

void print(char c[n][n]) {
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			if(visit[i][j]) cout << "*" << " ";
			else cout << chess[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}

void dfs(int  x, int y) {
	if(x >= n || y >= n ) return;
	
	if(!visit[x][y])
		visit[x][y] = 1;
	if(x == n -1 && y == n - 1) {
		count++;
		print(chess);
		visit[x][y] = 0;
		return;
	}
	dfs(x,y + 1);
	dfs(x + 1,y + 1);
	dfs(x + 1,y);
	visit[x][y] = 0;

}

int main() {
	memset(visit,0,sizeof(visit));
	memset(chess,'0',sizeof(chess));
	dfs(0,0);
	cout << "\n可行性方案数目: "<< count << " 种" << endl;
}

算法图示

规模为4×4的二维数组规模大了些,让我们用规模为2×2的二维数组模拟满足题述条件前提下的过程:
在这里插入图片描述
在这里插入图片描述

发布了9 篇原创文章 · 获赞 7 · 访问量 2116

猜你喜欢

转载自blog.csdn.net/weixin_43715601/article/details/102993536
今日推荐