迷宫(dfs)

时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
晚上,跑男们来了节目的最后一站:江苏省扬州中学,完成最后一项比赛:撕名牌。撕名牌的地点是一个由n*n房间组成的正方形,每个房间里都有一个数字,表示从这个房间可以通过地道向右或向下穿过几个房间。从左上角开始,如果谁能安全到达右下角就算胜利。

这里4*4的方格中每一格表示进入这个房间时,队员可以向右或向下穿过的房间数。
郑恺是奔跑小王子,当他拿到这张地图时,脸都变绿了,速度再快,进了迷宫一样的房间也是没办法啊,还好参加JSOI2015夏令营的小伙伴都在,你能帮帮他算出从左上角可以到达右下角的路径数目吗?

输入
第一行为一个整数n,表示棋盘的大小。
以下有n行,每行有n个数字(数字与数字之间有一个空格隔开),表示在相应的格子内,棋子可以向右或向下跳跃的格子数。

输出
输出共一行,包含一个数,表示从左上角可以到达右下角的路径数目。
样例输入 Copy

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

样例输出 Copy

3

提示
对于100%的数据,1≤n≤100。
一开始看到数据量最大为100,感觉dfs可能会超时,就尝试bfs+queue,结果内存超限(???),后来尝试在bfs的基础上判断该点是否被访问过,这下子答案又不对了。。。
其实模拟一下样例,就会发现类似于“先访问的结点,它的孩子先访问”这种特点,这也是为什么我先想到用bfs+queue的原因。后来静下心来想想,用dfs也可以,不过一定一定要剪枝,否则还会超时。这里剪枝的条件是移动后的横坐标或纵坐标超出范围,不难想到运行时可能会有相当一部分解会被剪枝。统计条数的条件时搜索到(n,n),同时结束递归。然后就是dfs的模板了,vis数组用于标记某点是否被访问过。

#include<cstdio>
using namespace std;
int pane[105][105];
int vis[105][105]={0};
int n,cnt=0;
void f(int x,int y)
{
    if(x>=n+1||y>=n+1)return;
    if(x==n&&y==n)
    {
        cnt++;
        return;
    }
    if(x+pane[x][y]<=n&&vis[x+pane[x][y]][y]==0)//向右移动
    {
        vis[x+pane[x][y]][y]=1;
        f(x+pane[x][y],y);//搜索右侧的点
        vis[x+pane[x][y]][y]=0;
    }
    if(y+pane[x][y]<=n&&vis[x][y+pane[x][y]]==0)//向下移动
    {
        vis[x][y+pane[x][y]]=1;
        f(x,y+pane[x][y]);//搜索下侧的点
        vis[x][y+pane[x][y]]=0;
    }
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d",&pane[i][j]);
        }
    }
    f(1,1);
    printf("%d",cnt);
    return 0;
}
/**************************************************************
    Language: C++
    Result: 正确
    Time:43 ms
    Memory:1204 kb
****************************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵迷宫是一个非常有趣的问题,可以通过深度优先搜索算法(DFS)来解决。下面是一个使用Python语言编写的矩阵迷宫DFS程序的设计思路。 首先,我们需要定义一个函数来判断某个位置是否可以作为下一步的移动目标。在矩阵迷宫中,我们通常用1表示可行路线,用0表示墙壁或不可行路线。因此,我们可以定义一个函数is_valid(row, col, maze),其中row和col分别表示当前位置的行和列,maze是迷宫的矩阵表示。在这个函数中,我们可以判断当前位置是否越界或者是墙壁,如果满足这些条件,则说明不可行,返回False,否则返回True。 接下来,我们可以定义一个递归的函数dfs(row, col, maze, visited),其中row和col表示当前位置的行和列,maze是迷宫的矩阵表示,visited是一个与maze相同大小的矩阵,表示是否已经访问过。在这个函数中,我们首先判断当前位置是否是终点(例如迷宫的右下角),如果是,则找到了一条可行路径,返回True。如果当前位置不是终点,则标记当前位置为已访问,并依次判断当前位置的上、下、左、右四个方向是否可行。如果某个方向可行,我们可以将当前位置移动到该方向,并递归调用dfs函数。如果在某个方向上找到了一条可行路径,我们可以返回True,否则继续搜索其他方向。如果四个方向都不可行,我们可以将当前位置的visited标记为False,并返回False。 最后,我们可以定义一个主函数solve(maze),其中maze是迷宫的矩阵表示。在这个函数中,我们可以首先创建一个与maze相同大小的visited矩阵,并将所有元素初始化为False。接下来,我们调用dfs函数从迷宫的起点(例如迷宫的左上角)开始搜索,并将结果返回。 这样,我们就完成了一个使用深度优先搜索算法解决矩阵迷宫问题的程序。通过调用主函数,并传入迷宫矩阵作为参数,我们可以获得是否存在可行路径的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值