(dfs)迷宫探索
来源:互联网 发布:今日头条点赞软件下载 编辑:程序博客网 时间:2024/05/17 10:07
数据结构实验之图论四:迷宫探索
Problem Description
有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?
Input
连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。
Output
若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。
访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。
Example Input
16 8 11 22 33 44 55 66 43 61 5
Example Output
1 2 3 4 5 6 5 4 3 2 1
思路
这道题一开始就没有分析透题,导致代码错误,另外就是题目给的案例比较特殊,使得思路太过于狭窄,,,最基本的往往就是最重要的,做题不要投机取巧。。。“点亮所有可以点亮的灯后,以原路返回的方式回到起点”这句话很有迷惑性,实际就是在深搜过程中,当走不下去返回上一结点,再次经过这一结点时,需要记录。
错误代码:
/*5 7 55 45 15 21 21 31 43 4*///局限性:只对于最大度为2的图适用。#include <iostream>#include <string.h>using namespace std;#define N 1001int visited[N],q[N],r=0;int Graph[N][N];void dfs(int n,int s){ q[r++]=s; visited[s]=1; for(int i=1;i<=n;i++) { if(Graph[s][i]==1&&!visited[i]) { dfs(n,i); } }}int main(){ int n,m,s,u,v; memset(Graph,0,sizeof(Graph)); memset(visited,0,sizeof(visited)); memset(q,0,sizeof(q)); cin>>n>>m>>s; for(int i=0;i<m;i++) { cin>>u>>v; Graph[u][v]=Graph[v][u]=1; } dfs(n,s); if(r==n) { for(int i=0;i<r;i++) { cout<<q[i]<<" "; } for(int i=r-2;i>=0;i--) { if(i==0) cout<<q[i]<<endl; else cout<<q[i]<<" "; } }else{ for(int i=0;i<r;i++) { cout<<q[i]<<" "; } for(int i=r-2;i>=0;i--) { cout<<q[i]<<" "; } cout<<"0"<<endl; } return 0;}
代码
#include <iostream>#include <string.h>using namespace std;#define N 1001int visited[N],q[N],r=0;int Graph[N][N];void dfs(int n,int s){ q[r++]=s; visited[s]=1; for(int i=1;i<=n;i++) { if(Graph[s][i]==1&&!visited[i]) { dfs(n,i); q[r++]=s;//返回时,记录的结点的信息 } }}int main(){ int n,m,s,u,v; memset(Graph,0,sizeof(Graph)); memset(visited,0,sizeof(visited)); memset(q,0,sizeof(q)); cin>>n>>m>>s; for(int i=0;i<m;i++) { cin>>u>>v; Graph[u][v]=Graph[v][u]=1; } dfs(n,s); if(r==2*n-1) { for(int i=0;i<r-1;i++) { cout<<q[i]<<" "; } cout<<q[r-1]<<endl; }else{ for(int i=0;i<r;i++) { cout<<q[i]<<" "; } cout<<"0"<<endl; } return 0;}
阅读全文
1 0
- (dfs)迷宫探索
- PAT--地下迷宫探索--dfs
- sdut 3361迷宫探索dfs
- SDUT 数据结构实验之图论四:迷宫探索 (DFS)
- sdut oj3361 数据结构实验之图论四:迷宫探索(DFS)
- SDUT 3361 数据结构实验之图论四:迷宫探索(DFS)
- 数据结构实验之图论四:迷宫探索dfs
- PTA-地下迷宫探索(DFS,水题)
- 求解迷宫(DFS)
- 走迷宫(Dfs)
- 迷宫问题(dfs)
- 迷宫问题(DFS)
- [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
- 数据结构实验之图论四:迷宫探索(邻接表与DFS)
- 5-33 地下迷宫探索 (30分) -- dfs
- SDUT 3361-数据结构实验之图论四:迷宫探索(dfs)
- sdutoj 3361 数据结构实验之图论四:迷宫探索(dfs)
- uva 784 Maze Exploration(迷宫探索) —— DFS
- CodeForces
- ARKit从入门到精通(1)-ARKit初体验
- #以应用为中心的无服务器PaaS将成主流
- SGU 319 Kalevich Strikes Back(线段树+扫描线)
- 内存溢出和内存泄漏的区别
- (dfs)迷宫探索
- Random 不重复
- Linux 初始 RAM磁盘(initrd)概述
- 轻松理解 Android Binder,只需要读这一篇
- Android通用标题栏
- eclipse配置字体、背景颜色
- asp.net 实现session过期跳转到首页
- IIS7.5全站301跳转,内页+带参数url,这才是真正的全站跳转
- VS2010+QT5.4