[SDUT](1269)走迷宫 ---DFS(图)
2017-08-12 14:38
369 查看
走迷宫
Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic Discuss
Problem Description
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
Input
第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
Output
所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。
Example Input
5 4 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 5 4
Example Output
(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4) (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
学习新知:这道题和SDUT(2449)几乎一致,主要要考虑如何输出路径~
AC代码:#include<iostream> #include<cstring> #include<cstdio> using namespace std; int mmap[20][20]; int vis[20][20]; int step; int I[400];//I,J这两个数组用来记录满足题意的每条路径上的点 int J[400];// int dirx[]={0,-1,0,1};//上、下、左、右四个方向 int diry[]={-1,0,1,0}; int n,m; int stx,sty; int enx,eny; int flag; struct m { int x; int y; }; void print() { for(int i=0;i<step;i++) printf(i==0?"(%d,%d)":"->(%d,%d)",I[i],J[i]); cout<<endl; } void dfs(int x,int y) { struct m tmp; if(x<1 || y<1 || x>n ||y>m) //防止越界 return; if(x==enx && y==eny) { flag=1; print(); return; } for(int i=0;i<4;i++) //这道题认真考虑如何利用递归巧妙记录路径上的点 { tmp.x=x+dirx[i]; tmp.y=y+diry[i]; if(!vis[tmp.x][tmp.y] && mmap[tmp.x][tmp.y]==1) { vis[tmp.x][tmp.y]=1; I[step]=tmp.x; J[step]=tmp.y; step++; dfs(tmp.x,tmp.y); vis[tmp.x][tmp.y]=0; //因为有的点要重复走,所以要将标记取消 step--; } } } int main() { cin>>n>>m; step=0; flag=0; memset(mmap,0,sizeof(mmap)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mmap[i][j]; } } cin>>stx>>sty; cin>>enx>>eny; vis[stx][sty]=1; I[0]=stx; J[0]=sty; step++; dfs(stx,sty); if(flag==0) cout<<-1<<endl; return 0; }
相关文章推荐
- DFS- SDUT1269 走迷宫
- SDUT 1269 走迷宫
- [SDUT](2449)走迷宫 ---DFS(图)
- SDUT 1269-走迷宫(DFS打印路径)
- SDUT 1269走迷宫(DFS+打印路径)
- sdut1269 走迷宫(dfs)
- SDUT-1269 走迷宫(DFS)
- 走迷宫sdut1269(附带dfs求所有路径与bfs求最佳路径)
- SDUT 1269-走迷宫(DFS打印路径)
- sdut 2449走迷宫【最简单的dfs应用】
- SDUT 1265-马拦过河卒(DFS)
- SDUT 3322 DFS暴力 数论
- SDUT_2015寒假集训_BFS&DFS_J-Catch That Cow
- hdoj 1269 迷宫城堡 【强连通】&&【dfs】
- dfs走迷宫_深度优先搜索
- SDUT 1269 走迷宫
- FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)
- SDUT 走迷宫(DFS)
- [sdut] 1400 马的走法 dfs
- SDUT 2138 图结构练习——BFSDFS——判断可达性