2753:走迷宫(dfs+初剪)//可以说是很水了。。。

总时间限制: 
1000ms

内存限制: 
65536kB
描述
一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
输入
第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用‘.‘表示,有障碍物的格子用‘#‘表示。
迷宫左上角和右下角都是‘.‘。
输出
输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
样例输入
5 5
..###
#....
#.#.#
#.#.#
#.#..
样例输出
9

、、虽然水了点但为了为走上歧途的同学解答还是写了题解,这大概是第一次写dfs的题解。。。。。

首先看到这题的第一反应不应该是dfs(反正我第一个想到的是dp)不过既然要dfs的那就好好看看吧首先发现数据十分水所以不要记忆化不要记忆化的代码是令人愉悦的所以就开动了首先是状态数组,bool b【】【】把‘’0‘’作为‘’墙‘’在输入时直接处理好然后我们发现可以上下左右乱爬那写四个if????我有点恐惧,所以最好使用方向数组mapp【】【】做好可爱的回溯后就是简单的优化比如当我们发现k(目前步数)已经大于记录的最小步了那就直接give out it!所以。。。。上代码吧
#include<bits/stdc++.h>
using namespace std;
char c;
int ans=0x7fffff,m,n;
bool b[1000][1000];
int mapp[3][5];
void dfs(int x,int y,int k)
{
    if(x==m&&y==n)
    {
      ans=min(ans,k);
      return ;
    }
    if(k>ans)
    return ;
    for(int i=1;i<=4;i++)
    {
    if(b[x+mapp[1][i]][y+mapp[2][i]]==1){
    b[x+mapp[1][i]][y+mapp[2][i]]=0;
    dfs(x+mapp[1][i],y+mapp[2][i],k+1);
    b[x+mapp[1][i]][y+mapp[2][i]]=1;
    }
    }
}
int main()
{
    cin>>m>>n;
    mapp[1][1]=-1;mapp[2][1]=0;
    mapp[1][2]=1;mapp[2][2]=0;
    mapp[1][3]=0;mapp[2][3]=1;
    mapp[1][4]=0;mapp[2][4]=-1;
    for(int i=1;i<=m;i++)
      for(int j=1;j<=n;j++){
            cin>>c;
            if(c==‘#‘)
            b[i][j]=0;
            else
            b[i][j]=1;
    }
    dfs(1,1,1);
    cout<<ans;
}

//终于水完这题了。。。

//恩,那就这样吧。。。。(表示懒,不想记忆化)

 

原文地址:https://www.cnblogs.com/crazily/p/9689041.html

时间: 2024-11-09 06:14:41

2753:走迷宫(dfs+初剪)//可以说是很水了。。。的相关文章

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

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

2753:走迷宫

题目链接:http://noi.openjudge.cn/ch0205/2753/ 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. 输入 第一行是两个整数,R和C,代表迷宫的长和宽.( 1<= R,C <= 40)接下来是R行,每行C个字符,代表整个迷宫.空地格子用'.'表示,有障碍物的

【递归入门】走迷宫-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 v

算法:老鼠走迷宫问题

算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路. [代码] 对题目的描述部分 int migo[7][7]={ {2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 0, 0, 2, 2},

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的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与

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

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

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

一.深度优先搜索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