洛谷 P1238 走迷宫
Posted SilverNebula
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1238 走迷宫相关的知识,希望对你有一定的参考价值。
因为小处疏漏,多花了半小时的水题
题目描述
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。
输入输出格式
输入格式:
第一行是两个数m,n(1<m,n<15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
输出格式:
所有可行的路径,描述一个点时用(x,y)的形式,除开始点外,其他的都要用“一>”表示方向。
如果没有一条可行的路则输出-1。
输入输出样例
输入样例#1:
5 6 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 5 6
输出样例#1:
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
题目本身没什么难度
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=100; 9 int mp[mxn][mxn]; 10 int vis[mxn][mxn]; 11 int n,m; 12 int sx,sy,ex,ey;//始终点坐标 13 int wx[mxn*10],wy[mxn*10];//路径 14 int mx[5]={0,-1,0,0,1}, 15 my[5]={0,0,-1,1,0}; 16 bool flag=0; 17 void Print(int len){ 18 for(int i=1;i<len;i++)printf("(%d,%d)->",wx[i],wy[i]); 19 flag=1; 20 // printf("(%d,%d)\n",wx[len],wy[len]); 21 return; 22 } 23 void dfs(int x,int y,int L){ 24 if(x==ex && y==ey){ 25 Print(L); 26 printf("(%d,%d)\n",x,y); 27 return; 28 } 29 //顺序为左下右上 30 wx[L]=x;wy[L]=y; 31 vis[x][y]=1; 32 for(int i=0;i<=4;i++){ 33 int nx=x+mx[i]; 34 int ny=y+my[i]; 35 // printf("test: %d %d %d\n",nx,ny,L); 36 if(nx>0 && nx<=m && ny>0 && ny<=n && mp[nx][ny] && !vis[nx][ny]){ 37 dfs(nx,ny,L+1); 38 } 39 } 40 vis[x][y]=0; 41 return; 42 } 43 int main(){ 44 scanf("%d%d",&m,&n); 45 int i,j; 46 for(i=1;i<=m;i++) 47 for(j=1;j<=n;j++){ 48 scanf("%d",&mp[i][j]); 49 } 50 scanf("%d%d",&sx,&sy); 51 scanf("%d%d",&ex,&ey); 52 wx[1]=sx;wy[1]=sy; 53 vis[sx][sy]=1; 54 if(sx==ex && sy==ey){ printf("-1\n") ;return 0;} 55 dfs(sx,sy,1); 56 if(!flag)printf("-1\n"); 57 return 0; 58 }
以上是关于洛谷 P1238 走迷宫的主要内容,如果未能解决你的问题,请参考以下文章