sdut oj2449 走迷宫(DFS)

来源:互联网 发布:魔鬼积木知乎 编辑:程序博客网 时间:2024/04/29 03:37

题目链接:点击打开链接

走迷宫

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 种走法。

示例输入

32 20 10 02 20 11 02 30 0 00 0 0

示例输出

104

提示

 
代码实现:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;int s[10][10] = {0};///等于0时表示没有来过这个坐标int n,m,num = 0;int mp[10][10];///记录0,1,表示地图int dx[] = {0,0,1,-1};int dy[] = {-1,1,0,0};///表示四个方向int flag(int x,int y)///判断该点是否在地图中并且保证没来过这个坐标而且可以通过{    if(x >= 1&&x <= n&&y >= 1&&y <= m&&!s[x][y]&&!mp[x][y])        return 1;    return 0;}void DFS(int x,int y){    if(x == n&&y == m)    {        num++;///每次到达(n,m)时路径+1    }    s[x][y] = 1;    for(int i = 0;i < 4;i++)///遍历四个方向    {        if(flag(x + dx[i],y + dy[i]))        {            s[x + dx[i]][y + dy[i]] = 1;            DFS(x + dx[i],y + dy[i]);///每次到达新的位置都进行递归调用            s[x + dx[i]][y + dy[i]] = 0;        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        num = 0;        memset(mp,0,sizeof(mp));///对地图进行清零        scanf("%d%d",&n,&m);        for(int i = 1;i <= n;i++)        {            for(int j = 1;j <= m;j++)            {                scanf("%d",&mp[i][j]);            }        }        DFS(1,1);///从点(1,1)开始        printf("%d\n",num);    }    return 0;}


0 0
原创粉丝点击