【递归入门】走迷宫-DFS

题目链接:http://codeup.cn/problem.php?cid=100000608&pid=5

===

这题 初始点标记访问那块一开始弄反了一直提示输出超限,艹坑了我好久啊啊!


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int m,n;//m行n列的迷宫
 4 int start_x,start_y,end_x,end_y;
 5 int map_[20][20]={0};
 6 int flag=0;
 7 bool visit[20][20]={false};
 8 int nexto[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//左上右下
 9 struct Point{
10     int x;
11     int y;
12     Point(int c,int d):x(c),y(d){}
13 };
14 vector<Point>my;
15 void DFS(int x,int y){
16     int tx=0,ty=0;
17     if(x==end_x&&y==end_y){
18             flag=1;
19         for(int i=0;i<my.size()-1;i++){
20             printf("(%d,%d)->",my[i].x,my[i].y);//!不用加 &符号
21         }
22         printf("(%d,%d)\n",my[my.size()-1].x,my[my.size()-1].y);
23         return;
24     }
25     for(int i=0;i<4;i++){
26         tx=x+nexto[i][0];
27         ty=y+nexto[i][1];//下一步方向
28         if(tx<1||ty<1||tx>m||ty>n||visit[tx][ty]==true) continue;//剪枝
29         if(visit[tx][ty]==false&&map_[tx][ty]==1){
30             my.push_back(Point(tx,ty));
31             visit[tx][ty]=true;
32             DFS(tx,ty);
33             visit[tx][ty]=false;
34             my.pop_back();//回溯
35         }
36     }
37 }
38 int main(){
39     while(scanf("%d %d",&m,&n)!=EOF){
40         flag=0;
41         my.clear();
42         memset(map_,0,sizeof(map_));
43         memset(visit,false,sizeof(visit));
44         for(int i=1;i<=m;i++){
45             for(int j=1;j<=n;j++){
46                 scanf("%d",&map_[i][j]);//初始化迷宫
47             }
48         }
49         scanf("%d %d",&start_x,&start_y);
50         //压入初始点
51         my.push_back(Point(start_x,start_y));
52         scanf("%d %d",&end_x,&end_y);
53         visit[start_x][start_y]=true;//就是这里!!一开始我赋值是false 一直提示输出超限,,,我还寻思我这输入输出有问题??淦- -
54         DFS(start_x,start_y);
55         if(flag==0) printf("-1\n");
56     }
57     return 0;
58 }

原文地址:https://www.cnblogs.com/YanShaoDian/p/12683353.html

时间: 2024-08-04 11:32:23

【递归入门】走迷宫-DFS的相关文章

NYOJ306 走迷宫(dfs+二分搜索)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路

【递归】走迷宫

走迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 判断是否能从迷宫的入口到达出口 输入: 先输入两个整数表示迷宫的行数m和列数n,再输入口和出口的坐标,最后分m行输入迷宫,其中1表示墙,0表示空格每个数字之间都有空格. 输出: 若能到达,则输出"Yes",否则输出"No",结果占一行. 输入样例: 3 30 02 20 0 01 1 00 1 0 输出样例: Yes 1 #include <stdio.h> 2 #incl

SDUT 走迷宫(DFS)

走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n

数据结构之 栈与队列--- 走迷宫(深度搜索dfs)

走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n, m) !=(1, 1)

第四届河南省acm省赛 走迷宫(二分法枚举差值和最大值最小值+DFS)

走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

青蛙走迷宫问题(体力值)

题目: 青蛙走迷宫,1代表路通,0代表不通:起点是(0, 0),终点是(0,m - 1);青蛙每次向上走需要消耗体力值为3,向下走不消耗体力值,平走消耗体力值1:根据给定值判断青蛙是否可以根据初始值到达终点,并求出消耗体力值最少的路径: 举例: n = 4, m =4, p = 10(体力值) 4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 则结果为:[[0, 0], [1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [1, 3], [

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图