问题引入
有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了...
问题分析
1首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q)。其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径。
此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向。
在这里我们规定一个顺序,按照顺时针的方向来尝试(即右→下→左→上)。
2我们先来看看小哼一步之内可以到达的点有哪些?只有(1,2)和(2,1)。
根据刚才的策略,我们先往右边走,但右边(1,3)有障碍物,所以只能往下(2,2)这个点走。但是小哈并不在(2,2)这个点上,所以小哼还得继续往下走,直至无路可走或者找到小哈为止。
注意:并不是让我们找到小哈此题就解决了。因为刚才只是尝试了一条路的走法,而这条路并不一定是最短的。刚才很多地方在选择方向的时候都有多种选择,因此我们需要返回到这些地方继续尝试往别的方向走,直到把所有可能都尝试一遍,最后输出最短的一条路径。
#include<stdio.h> int m,n,p,q; int next[4][2],book[51][51],book1[51],book2[51],a[51][51]; int min=99999; void dfs(int x,int y,int step) { int tx,ty,k,j; if(x == p && y == q) { if(step<min) min = step; for(j=0;j<step;j++) printf("(%d %d) ",book1[j],book2[j]); printf(" "); return; } int next[4][2]= { {0,1}, //右走 {1,0}, //下走 {0,-1}, //左走 {-1,0}, //上走 }; for(k=0;k<=3;k++) { tx = x + next[k][0]; ty = y + next[k][1]; if(tx>n||ty>m||tx<1||ty<1) continue; if(a[tx][ty]==0 && book[tx][ty]==0) { book1[step] = tx; book2[step] = ty; book[tx][ty] = 1; dfs(tx,ty,step+1); book[tx][ty] = 0; } } return; } int main() { int i,j,startx,starty; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } scanf("%d %d %d %d",&startx,&starty,&p,&q); book[startx][starty] = 1; dfs(startx,starty,0); printf("%d",min); return 0; }