给定迷宫起点和终点,寻找一条从起点到终点的路径。
(0,1) | |||||
(2,0) | 起点 (1,1) | (1,2) | (1,3) | (1,4) | |
(2,0) | (2,1) | (2,4) | |||
(3,0) | (3,1) | (3,2) | 终点 (3,4) | ||
(4,1) |
上图中黄色代表墙,白色代表通路,起点为(1,1),终点为(3,4)。
要求搜寻策略是从起点开始按照“上、下、左、右”四个方向寻找终点,到下一个点继续按照“上、下、左、右”四个方面寻找,当该结点四个方向都搜寻完,但还没到终点时,退回到上一个点,直到找到终点或者没有路径。
比如上图从(1,1)开始,向上(0,1)不通,向下到(2,1);到了(2,1)后继续按“上、下、左、右”四个方面寻找,上已经走过,向下到(3,1);到(3,1)后上已经走过,下和左不通,向右到(3,2);到(3,2)四个方面都不通,回到(3,1)四个方向都不通,再回到(2,1),(1,1);到达(1,1)后下已经走过,左不通,继续向右走,重复这个过程最后到达(3,4)。
Input
第一行两个数m和n表示迷宫的行数和列数。迷宫大小不超过100×100
第二行四个数x1,y1,x2,y2分别表示起点和终点的坐标。
接下来是m行n列的数,用来表示迷宫,1表示墙,0表示通路。
Output
从起点到终点所经过的路径的坐标。如果不存在这样的路径则输出“No Path!”。
Sample Input
5 6 1 1 3 4 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1
Sample Output
(1 1)(1 2)(1 3)(1 4)(2 4)(3 4)
HINT
这种方法得到的不一定是最短路径,如果想得到最短路径采用广度优先算法(队列)
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10000
typedef struct date
{
int q;
int w;
}DATE;
int main()
{
int i,o,m,n,x1,y1;
int x2,y2;
int a[100][100];
int x,y,z=-1;
DATE p[maxsize];
scanf("%d %d",&m,&n);
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=0;i<=m-1;i++)
{
for(o=0;o<=n-1;o++)
scanf("%d",&a[i][o]);
}
x=x1;
y=y1;
z++;
p[z].q=x;
p[z].w=y;
a[x][y]=2;
while(1)
{
if(a[x-1][y]==0)
{
x--;
z++;
p[z].q=x;
p[z].w=y;
a[x][y]=1;
}
else if(a[x+1][y]==0)
{
x++;
z++;
p[z].q=x;
p[z].w=y;
a[x][y]=1;
}
else if(a[x][y-1]==0)
{
z++;
y--;
p[z].q=x;
p[z].w=y;
a[x][y]=1;
}
else if(a[x][y+1]==0)
{
y++;
z++;
p[z].q=x;
p[z].w=y;
a[x][y]=1;
}
else
{
if(x==x2&&y==y2)
{
for(i=0;i<=z;i++)
printf("(%d %d)",p[i].q,p[i].w);
break;
}
else if(x==x1&&y==y1)
{
printf("No Path!\n");
break;
}
else
z--;
x=p[z].q;
y=p[z].w;
}
}
return 0;
}