问题 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++)相关推荐

  1. java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)

    /*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选 ...

  2. java递归老鼠走迷宫_老鼠走迷宫----------递归问题

    老鼠走迷宫是一个典型的递归的问题,写几个这样的题才可以充分理解递归的过程. 写递归的过程有几点需要注意: (1)递归结束的条件 (2)递归过程的脉络,即逻辑要清晰. / // // 在迷宫中显示老鼠能 ...

  3. 5978 Problem F 【递归入门】走迷宫

    问题 F: [递归入门]走迷宫 时间限制: 1 Sec 内存限制: 128 MB 提交: 128 解决: 46 题目描述 有一个n*m格的迷宫(表示有n行.m列),其中有可走的也有不可走的,如果用1表 ...

  4. 迷宫python_Python走迷宫,递归 - nixBlog

    递归走迷宫,练手. 23下午就写好的,可是测试几种不同的迷宫后,发现有个Bug,我以为算法有问题,今早才发现,原来是isDest函数里r和c都写成r了,拷贝out函数的语句再改写造成的悲剧. #!/u ...

  5. Java递归解决老鼠走迷宫问题

    思路 1 表示障碍 代码 public class MiGong{public static void main(String[] args){int[][] map = new int[8][7]; ...

  6. DFS(入门题,走迷宫)

    1185: 走迷宫 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 383 Solved: 155 [Submit][Status][Web Board] ...

  7. 递归走迷宫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 ...

  8. java走迷宫_走迷宫问题Java递归

    public class MazeDemo { /* 走迷宫,1代表墙,从左上角的0走到右下角的0,找到一条通路,若存在,返回true,若不存在,返回false 1 1 1 1 1 1 1 1 0 0 ...

  9. 华为OD机试 - 机器人走迷宫(Python)| 递归的使用

    OD统一考试B卷:机器人走迷宫 题目 房间有 X*Y 的方格组成,例如下图为6*4的大小.每一个放个以坐标(x,y)描述. 机器人固定从方格(0,0)出发,只能向东或者向北前进, 出口固定为房间的最东 ...

  10. 无脑单细胞竟会走迷宫、规划交通路线,这种难以归类的生物重定义了智能

    本文转载自公众号SME 在电子游戏的一般套路设定下,蠢萌的史莱姆总是那个最低级的怪物. 它们几乎没有智商可言,攻击手段单一且总是以动技能著称,正所谓"烂泥扶不上壁". 而纵观各个类 ...

最新文章

  1. c语言int t格式,如何在C中打印int64_t类型
  2. 网络:http请求之几种常见技术
  3. 总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
  4. 【学习笔记】21、随机数模快
  5. Codeforces 491B. New York Hotel 最远曼哈顿距离
  6. [leetcode]102.二叉树的层序遍历
  7. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
  8. webapi找到了与该请求匹配的多个操作
  9. 使用 Strace 和 GDB 调试工具的乐趣
  10. php sesssion,php sesssion原理
  11. add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'
  12. 一个关于mahout0.5放置位置的错误,,,
  13. decimal.JS 快速入门
  14. java面试的职业规划怎么说_java面试技巧-职业规划有技巧
  15. 工频逆变器有哪些应用?工频逆变器、高频逆变器有何区别?
  16. 计算机测配色原理,计算机测配色教学方法论文
  17. 2020.04.16今日份学习小结
  18. 语音转文字转换器怎么用,免费的语音转文字方法介绍
  19. MySQL 5.7 安装教程(全步骤、保姆级教程)
  20. 大数据的应用场景都有哪些(医疗篇)

热门文章

  1. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
  2. 快速创建精彩的Flash游戏之一:Flash游戏引擎及框架介绍
  3. 静态网页项目开发基础
  4. ListView组件的应用
  5. 【自我介绍】小白程序员的成神之路
  6. docker安装踩坑
  7. 一种测试方法论RST(非广告)
  8. 开发”小米商城官网首页”(静态页面)
  9. mysql error 1114_ERROR 1114 (HY000): The table 'test1' is full 的解决
  10. win10清除系统垃圾的几个命令