sdutoj 2449 走迷宫 (DFS)

原创 2016年08月01日 21:11:50

走迷宫

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) ) 接下来n 行,每行m 个数。其中第i 行第j 个数是0 表示第i 行第j 个格子可以走,否则是1 表示这个格子不能走,输入保证起点和终点都是都是可以走的。

任意两组测试数据间用一个空行分开。

输出

 对于每组测试数据,输出一个整数R,表示有R 种走法。

示例输入

3
2 2
0 1
0 0
2 2
0 1
1 0
2 3
0 0 0
0 0 0

示例输出

1
0
4


///dfs开始入门 ,入门级代码

///Accode

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int s[10][10],n,m,num=0;
int ma[10][10]= {0}; ///0表示没来过这个坐标
int dx[]= {0,0,1,-1};
int dy[]= {-1,1,0,0}; ///上下左右四个位置

bool flag(int x,int y) ///状态判断 数组边界以及是否搜索到过这个点或者这个点在迷宫中可以不可以走
{
    if (x>=1 && x<=n && y>=1 && y<=m && !ma[x][y] && !s[x][y])
    {
        return 1;
    }
    return 0;
}

void dfs(int x,int y)
{
    if (x==n&&y==m)
    {
        num++;        ///num为不同的路
    }
    int i;
    ma[x][y]=1;
    for(i=0; i<=3; i++)  ///遍历四个位置
    {
        if (flag(x+dx[i],y+dy[i]))
        {
            ma[x+dx[i]][y+dy[i]]=1; ///记录搜索到状态
            dfs(x+dx[i],y+dy[i]);  ///递归调用
            ma[x+dx[i]][y+dy[i]]=0; ///将状态调回 因为他可能在下次搜索中用到
        }
    }
}

int main()
{
    int t,j,i;
    cin>>t;
    while (t--)
    {
        num=0;
        memset(ma,0,sizeof(ma));  ///不要忘记map清零
        cin>>n>>m;
        for (i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                cin>>s[i][j];
            }
        }
        dfs(1,1);  ///从1,1开始遍历
        cout<<num<<endl;
    }
    return 0;
}


版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~)

sdutacm-走迷宫

山东理工acm平台题解
  • axuhongbo
  • axuhongbo
  • 2017年02月26日 17:13
  • 649

DFS实现走迷宫

Description 给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走 Input 多组测试数据,每组第一行两个正整数,分别为n和m 表示n这个迷宫有n行m列(0...
  • zhazhabin
  • zhazhabin
  • 2016年04月19日 23:52
  • 1372

走迷宫回溯算法(Java实现)

以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1) 根据二维数组,输出迷宫的图形。 (...
  • u013474436
  • u013474436
  • 2015年08月25日 15:28
  • 4771

Java与算法之(5) - 老鼠走迷宫(深度优先算法)

小老鼠走进了格子迷宫,如何能绕过猫以最短的路径迟到奶酪呢? 注意只能上下左右移动,不能斜着移动。 在解决迷宫问题上,深度优先的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径。 首先用一...
  • autfish
  • autfish
  • 2016年09月06日 13:47
  • 9579

老鼠走迷宫问题(C++栈实现)

问题描述:用矩阵(二维数组)表示迷宫,其中1表示墙,0表示通路。老鼠在左上角,要走到迷宫右下角。很简单的一个问题,主要是利用栈来记录走的每一步。还有就是在原始迷宫周围加上一圈“墙”,,避免边缘路径需要...
  • quanwei940805
  • quanwei940805
  • 2015年04月08日 15:34
  • 2264

2014秋C++第19周 补充代码 回溯法走迷宫

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 问题...
  • sxhelijian
  • sxhelijian
  • 2015年01月07日 21:20
  • 3649

一道走迷宫算法题python实现

前几天逛博客时看到了这样一道问题,感觉比较有趣,就自己思考了下方案顺便用python实现了一下。题目如下: 用一个二维数组表示一个简单的迷宫,用0表示通路,用1表示阻断,老鼠在每个点上可以移动相邻的东...
  • sinly100
  • sinly100
  • 2017年06月01日 16:47
  • 819

【c++】利用递归实现走迷宫

要求: 1、将地图的数组保存在文件中,从文件中读取行列数 2.、动态开辟空间保存地图 3.、运行结束后再地图上标出具体的走法 说明: 1、文件中第...
  • a1414345
  • a1414345
  • 2016年12月24日 18:40
  • 1159

sdutoj 3361 数据结构实验之图论四:迷宫探索(dfs)

题目链接:点击打开链接 题目大意: 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? ...
  • txgANG
  • txgANG
  • 2016年05月12日 17:56
  • 776

递归与非递归实现走迷宫算法

●问题描述:   给出一个矩阵,其中0表示通路,1表示墙壁,这样就形成了一个迷宫,要求编写算法求出其中一条路径。 ●递归思路:   编写一个走迷宫函数,传入二位数组的下标,先假设该点位于最终路径上(...
  • Jung_zhang
  • Jung_zhang
  • 2015年10月09日 20:48
  • 6159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sdutoj 2449 走迷宫 (DFS)
举报原因:
原因补充:

(最多只允许输入30个字)