迷宫问题(深搜+回溯)
来源:互联网 发布:美国新英格兰大学知乎 编辑:程序博客网 时间:2024/05/16 04:21
Time Limit: 1 Sec Memory Limit:128 MB 64bit IO Format:%lld
[Submit][Status][Web Board]
设有一个N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。
Input
第一行一个正整数N;
接下来的包含N行,每行N个数。用来描述迷宫。
Output
输出路径总数。
Sample Input
30 0 00 1 11 0 0
Sample Output
2
这类问题重点在于访问过的点又可能还要再次访问,所以用dfs加简单回溯就可以了。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int N=15,sx[8]={-1,-1,-1,0,0,1,1,1} ,sy[8]={-1,0,1,-1,1,-1,0,1};//八个方向标记做好int n,sum=0;int s[N][N],a[N][N];//是否访问过标记void dfs(int x,int y){ if(x==0&&y==n-1) { sum++; return ; } for(int i=0;i<8;i++)//依次访问该点周围八个方向 { int nx=x+sx[i]; int ny=y+sy[i]; if(nx>=0&&nx<n&&ny>=0&&ny<n&&s[nx][ny]==0&&a[nx][ny]==0)//前四个为判断是否在迷宫中 最后一个是判断该点是否被访问过 { a[nx][ny]=1; dfs(nx,ny);//是没访问过的点并且是可行点,就继续搜索 a[nx][ny]=0;//回溯,重新置为0,方便下次访问 } } return ;}int main(){ while(cin>>n) { sum=0; memset(s,0,sizeof(s)); memset(a,0,sizeof(a)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>s[i][j]; a[0][0]=1;//左上角访问过,置为1; dfs(0,0); printf("%d\n",sum); } return 0;}已AC。
阅读全文
1 0
- 迷宫问题(深搜+回溯)
- 迷宫问题 (上)栈 回溯法
- poj 3984 迷宫问题(BFS+回溯)
- 数据结构-迷宫问题(回溯法)
- 迷宫问题 回溯法
- 回溯算法---迷宫问题
- 回溯法-迷宫问题
- 迷宫问题回溯算法
- 回溯--迷宫问题
- 回溯求解-迷宫问题
- 迷宫(回溯,递归)
- 迷宫(回溯算法)
- 回溯法求迷宫问题
- 回溯算法之迷宫问题
- 回溯法解迷宫问题
- 回溯法解迷宫问题
- 回溯法求迷宫问题
- 回溯法解决迷宫问题
- 爬虫之路
- 骁龙 835 人工智能技术:机器学习带来个性化体验
- xiaomi unable to install apk
- 天线开关和双工器
- C#---批量导入数据库
- 迷宫问题(深搜+回溯)
- Windows各端口的作用
- ARM平台下独占访问指令LDREX和STREX的原理与使用详解
- Java中调用Python并得到输出的用法
- Mysql常用
- Java通过Runtime类对系统命令的调用,备份数据库和图片示例
- POJ 2551 Dungeon Master
- C语言进阶之路------关于字符串函数的小例子(用函数连接两个字符串)
- CentOS 7使用yum安装MySql5.6.24