老鼠吃奶酪(老鼠图片大全)

老鼠吃奶酪(老鼠图片大全)本总结是是个人为防止遗忘而作,不得转载和商用。题目        一只老鼠位于迷宫左上角(0,0),迷宫中的数字9处有块大奶酪。0表示墙,1表示可通过路径。试给出一条可行的吃到奶酪的路径;若没有返回空。        假定迷宫是4连通的,即:老鼠只能上下左右走,不能斜着走。                  算法描述        这实际上就是练习深度优先搜索。

大家好,又见面了,我是你们的朋友全栈君。

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         一只老鼠位于迷宫左上角(0,0),迷宫中的数字9处有块大奶酪。0表示墙,1表示可通过路径。试给出一条可行的吃到奶酪的路径;若没有返回空。

         假定迷宫是4连通的,即:老鼠只能上下左右走,不能斜着走。

                  老鼠吃奶酪(老鼠图片大全)

算法描述

         这实际上就是练习深度优先搜索。

                   PS:个人感觉深度优先搜索就是个有点门道的暴力求解….

         解法:假定当前位于(i,j)处,则依次计算(i-1,j),(i+1,j),(i,j-1), (i,j+1)4个相邻位置,如果相邻位置不是墙,则可以通过。然后递归该过程。

代码

void MousePath(const vector<vector<int>>& chess)
{
	// 棋盘都是坐标,于是用int表示
	vector<pair<int, int>> path;
	// 初始化棋盘,所有值都标为False,即每个左边都还未被访问过
	vector<vector<bool>> visit(chess.size(),vector<bool>(chess[0].size(), false));
	// 开始路径搜索
	path.push_back(make_pair(0, 0));	// 从0,0开始
	visit[0][0] = true;	// 0,0被访问过
	Search( chess, 0, 0, path, visit ); // 开始搜索,对于棋盘chess,从0,0开始,记录路径path,访问的节点放置在visit。
}

bool Search(const vector< vector<int>>& chess, int i, int j, vector<pair<int, int>>&path, vector<vector<bool>>&visit)
{
	// 如果为9,那就找到了,打印path,返回ture
	if(chess[i][j] == 9) {
		Print(path);
		return true;
	}
	// 相对于当前的(i,j)点,(i-1, j),(i+1, j),(i, j-1),(i, j+1) 就是(-1, 0),(1, 0),(0, -1),(0, 1),于是iNext就是这四个点的i值,jNext就是相应的j值。
	int iNext[] = {0, 0, -1, 1};
	int jNext[] = {-1, 1, 0, 0};
	int iCur, jCur;
	// 棋盘大小是m*n的
	int m = (int)chess.size();
	int n = (int)chess[0].size();
	// 4代表4连通。
	for(int k = 0, k < 4; k++) {
		// 当前的(i,j)偏移一位。
		iCur = i+iNext[k];
		jCur = j+jNext[k];
		// 如果越界,则不可行
		if((iCur < 0) || (iCur >= m ) || (jCur < 0) || (jCur >= n ) continue;
		// 要求iCur和jCur从来没到达过且不是墙
		if(!visit[iCur][jCur] && (chess[iCur][jCur] != 0)) {
			// 把iCur和jCur放置在路径中
			path.push_back(make_pair(iCur, jCur));
			// 把iCur和jCur设置为已访问
			visit[iCur][jCur] = true;
			// 继续搜索
			if(Search(chess, iCur, jCur, path, visit)) {
				// 如果求所有路径,则将下句替换成all.push_back(path);
				return true;
			}
			// 从(iCur,jCur)找不到可行路径,把iCur和jCur pop出去,然后回溯一下继续探测。
			path.pop_back();
			visit[iCur][jCur] = false;
		}
	}
	return false;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125382.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 全国城市拼音对照表[通俗易懂]

    全国城市拼音对照表[通俗易懂]全国城市拼音对照表

    2022年8月4日
    3
  • Redis总结集群方式之主从复制[通俗易懂]

    Redis总结集群方式之主从复制[通俗易懂]绪论最近由于小编颈椎病犯了,所以最近停更了文章,今天下午刚收到几千里地老父亲寄来的艾灸贴,晚上贴上之后,伴随着火辣辣的感觉开始创作现在这篇文章;若大家get到了东西,请爱心三连。废话不再多言,下面我们进入正题。主从复制同步策略全量同步时机:slave初始化阶段;机制:slave服务器需要将master服务器上的所有数据都复制一份。增量同步时机:slave初始化之后且正常工作;机制:master服务器每执行一次新的写操作命令同步到slave服务器上,从服务器接收并执行该写命令操作;.

    2022年8月13日
    1
  • mybatis oracle 分页查询_oracle分页查询出现重复的问题

    mybatis oracle 分页查询_oracle分页查询出现重复的问题Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便。使用MyBatis中的RowBounds进行分页查询时,不需要在sql语句中写offset,limit,mybatis会自动拼接分页sql,添加offset,limit,实现自动分页。需要前台传递参数currentPage和page…

    2022年9月22日
    0
  • Idea激活码永久有效Idea2021.2.2激活码教程-持续更新,一步到位[通俗易懂]

    Idea激活码永久有效Idea2021.2.2激活码教程-持续更新,一步到位[通俗易懂]Idea激活码永久有效2021.2.2激活码教程-Windows版永久激活-持续更新,Idea激活码2021.2.2成功激活

    2022年6月17日
    290
  • 淘宝开源工具:Orztop

    淘宝开源工具:Orztop

    2022年3月11日
    37
  • Java volatile源码分析

    Java volatile源码分析synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile可以说是JVM提供的最轻量级的同步机制。jMM告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后什么时候写回到主内存中,实际上没有明确的限制。而针对volatile修饰的变量给java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读,从而保证数据的一个可见性。https://blog.

    2022年7月18日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号