题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
#include <math.h> #include <stdio.h> struct hl{ int h; int l; int s; int x; int z; int y; }; int dfs(struct hl *luxian,int a,int b,int o) { if((luxian[o]).h==a-1&&(luxian[o]).l==b-1)return 1; if ( luxian[o].s>0&& dfs(luxian,a,b,luxian[o].s))return 1; if ( luxian[o].x>0&& dfs(luxian,a,b,luxian[o].x))return 1; if ( luxian[o].z>0&& dfs(luxian,a,b,luxian[o].z))return 1; if ( luxian[o].y>0&& dfs(luxian,a,b,luxian[o].y))return 1; return 0; } int main() { int a, b; scanf("%d %d", &a, &b);// 注意 while 处理多个 case // 64 位输出请用 printf("%lld") to int mi[a][b],t=0; for(int i=0;i<a*b;i++) {scanf("%d",&mi[i/b][i%b]); if(mi[i/b][i%b]==0)t++; } struct hl luxian[t]; for(int i=0;i<t;i++) {luxian[i].s=-1; luxian[i].x=-1; luxian[i].z=-1;luxian[i].y=-1; } int zhan[200],jin=1,chu=0; int jian=1; zhan[0]=0;luxian[0].h=0;luxian[0].l=0; mi[0][0]=1; while(jin!=chu)//广度遍历建立多叉树 { if(luxian[chu].h>0&&mi[luxian[chu].h-1][luxian[chu].l]==0) { luxian[chu].s=jian; luxian[jian].h=luxian[chu].h-1; luxian[jian].l=luxian[chu].l; zhan[jin++]=jian; jian++; mi[luxian[chu].h-1][luxian[chu].l]=1;} else luxian[chu].s=-1; if(luxian[chu].h<a-1&&mi[luxian[chu].h+1][luxian[chu].l]==0){ luxian[chu].x=jian; luxian[jian].h=luxian[chu].h+1; luxian[jian].l=luxian[chu].l; zhan[jin++]=jian; jian++; mi[luxian[chu].h+1][luxian[chu].l]=1;} else luxian[chu].x=-1; if(luxian[chu].l>0&&mi[luxian[chu].h][luxian[chu].l-1]==0){ luxian[chu].z=jian; luxian[jian].l=luxian[chu].l-1; luxian[jian].h=luxian[chu].h; zhan[jin++]=jian;jian++; mi[luxian[chu].h][luxian[chu].l-1]=1;} else luxian[chu].z=-1; if(luxian[chu].l<b-1&&mi[luxian[chu].h][luxian[chu].l+1]==0){ luxian[chu].y=jian; luxian[jian].h=luxian[chu].h; luxian[jian].l=luxian[chu].l+1; zhan[jin++]=jian;jian++; mi[luxian[chu].h][luxian[chu].l+1]=1;} else luxian[chu].y=-1; chu++; } // printf("%d",a); //dfs(luxian,a,b,0)); for(int i=0;i<t;i++) if(dfs(luxian,a, b, i)) printf("(%d,%d)\n",luxian[i].h,luxian[i].l); return 0; }