【递归入门】走迷宫(c++)
问题 F: 【递归入门】走迷宫
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
有一个n×m格的迷宫(表示有n行、m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这n×m个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
请统一用 左上右下的顺序拓展,也就是 (0,-1),(-1,0),(0,1),(1,0)
输入
第一行是两个数n,m( 1 < n , m < 15 ),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
输出
所有可行的路径,描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示方向。
如果没有一条可行的路则输出-1。
样例输入 Copy
5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6
样例输出 Copy
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
思路
类似n皇后问题(建议先看),我们将问题看作是棋盘,处理每一个结点相当与选择一行,在每个点的四个方向上选择一个方向,相当于是去选择列放皇后,于是n×m个数据点成了(n×m)× 4 的棋盘。选择条件是:该结点值要为1,且不是已经过结点,且不超出边界。(就好比是皇后问题的在选择列放皇后时,不能选择已占有列,不能选择已有形成对角线)
要点
1、需要一个标记数组,判断这结点个是否已经用过了
2、对于当前位置(x,y)来说,由于与相邻的四个位置满足左上右下分别为(x,y-1)、(x-1,y)、(x,y+1)和(x+1,y),那么可以设两个增量数组来表示
int X[4]={0,-1,0,1};
int Y[4]={-1,0,1,0};
那么在选择点的邻结点时就可以这么遍历
for(int i=0;i<4;i++){int newx=nowx+X[i];int newy=nowy+Y[i];}
参考代码
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=100;
struct node{int x,y;node(int a,int b):x(a),y(b){}
};
int m,n;
int fx,fy,ex,ey; //起点和终点
int matrix[maxn][maxn]; //01矩阵
int mycount(0); //记录有几种方案
bool ismark[maxn][maxn]={false}; //标记数组
vector<node> temp; //记录路径
int X[4]={0,-1,0,1}; //增量数组
int Y[4]={-1,0,1,0};
bool judge(int x,int y){ //判断结点是否需要访问if(x>m||x<1||y>n||y<1)return false; //边界判断if(matrix[x][y]==0||ismark[x][y])return false; //已标记或结点为0return true;
}
void dfs(int nowx,int nowy){ //方法为深度优先搜索,输入当前结点if(nowx==ex&&nowy==ey){ //若结点为终点,则计数并输出mycount++;printf("(%d,%d)->",fx,fy);for(int i=0;i<temp.size()-1;i++){printf("(%d,%d)->",temp[i].x,temp[i].y);}printf("(%d,%d)\n",ex,ey);return;}for(int i=0;i<4;i++){ //遍历邻点int newx=nowx+X[i];int newy=nowy+Y[i];if(judge(newx,newy)){ // 访问邻点temp.push_back(node(newx,newy)); //将邻点设为下一路径结点ismark[nowx][nowy]=true; //并标记dfs(newx,newy);temp.pop_back(); //到这一步说明该邻点方案以实现完(或成功或失败)ismark[newx][newy]=false; //取消标记}}
}
int main()
{scanf("%d%d",&m,&n);for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){scanf("%d",&matrix[i][j]);}}scanf("%d%d%d%d",&fx,&fy,&ex,&ey);dfs(fx,fy);if(mycount==0)printf("-1");return 0;
}
如有错误,欢迎指正
【递归入门】走迷宫(c++)相关推荐
- java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)
/*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选 ...
- java递归老鼠走迷宫_老鼠走迷宫----------递归问题
老鼠走迷宫是一个典型的递归的问题,写几个这样的题才可以充分理解递归的过程. 写递归的过程有几点需要注意: (1)递归结束的条件 (2)递归过程的脉络,即逻辑要清晰. / // // 在迷宫中显示老鼠能 ...
- 5978 Problem F 【递归入门】走迷宫
问题 F: [递归入门]走迷宫 时间限制: 1 Sec 内存限制: 128 MB 提交: 128 解决: 46 题目描述 有一个n*m格的迷宫(表示有n行.m列),其中有可走的也有不可走的,如果用1表 ...
- 迷宫python_Python走迷宫,递归 - nixBlog
递归走迷宫,练手. 23下午就写好的,可是测试几种不同的迷宫后,发现有个Bug,我以为算法有问题,今早才发现,原来是isDest函数里r和c都写成r了,拷贝out函数的语句再改写造成的悲剧. #!/u ...
- Java递归解决老鼠走迷宫问题
思路 1 表示障碍 代码 public class MiGong{public static void main(String[] args){int[][] map = new int[8][7]; ...
- DFS(入门题,走迷宫)
1185: 走迷宫 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 383 Solved: 155 [Submit][Status][Web Board] ...
- 递归走迷宫java,java递归实现的迷宫游戏
java递归实现的迷宫游戏 public class Migong { private int gard[][]={ {1,1,1,1,0,1,1,1}, {0,0,0,1,1,1,1,1}, {1 ...
- java走迷宫_走迷宫问题Java递归
public class MazeDemo { /* 走迷宫,1代表墙,从左上角的0走到右下角的0,找到一条通路,若存在,返回true,若不存在,返回false 1 1 1 1 1 1 1 1 0 0 ...
- 华为OD机试 - 机器人走迷宫(Python)| 递归的使用
OD统一考试B卷:机器人走迷宫 题目 房间有 X*Y 的方格组成,例如下图为6*4的大小.每一个放个以坐标(x,y)描述. 机器人固定从方格(0,0)出发,只能向东或者向北前进, 出口固定为房间的最东 ...
- 无脑单细胞竟会走迷宫、规划交通路线,这种难以归类的生物重定义了智能
本文转载自公众号SME 在电子游戏的一般套路设定下,蠢萌的史莱姆总是那个最低级的怪物. 它们几乎没有智商可言,攻击手段单一且总是以动技能著称,正所谓"烂泥扶不上壁". 而纵观各个类 ...
最新文章
- c语言int t格式,如何在C中打印int64_t类型
- 网络:http请求之几种常见技术
- 总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
- 【学习笔记】21、随机数模快
- Codeforces 491B. New York Hotel 最远曼哈顿距离
- [leetcode]102.二叉树的层序遍历
- 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
- webapi找到了与该请求匹配的多个操作
- 使用 Strace 和 GDB 调试工具的乐趣
- php sesssion,php sesssion原理
- add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'
- 一个关于mahout0.5放置位置的错误,,,
- decimal.JS 快速入门
- java面试的职业规划怎么说_java面试技巧-职业规划有技巧
- 工频逆变器有哪些应用?工频逆变器、高频逆变器有何区别?
- 计算机测配色原理,计算机测配色教学方法论文
- 2020.04.16今日份学习小结
- 语音转文字转换器怎么用,免费的语音转文字方法介绍
- MySQL 5.7 安装教程(全步骤、保姆级教程)
- 大数据的应用场景都有哪些(医疗篇)