使用BFS算法,能求出最短的路径。
输入数据和前面一篇的一样。
下面贴出 BFS的实现:
#include <stdio.h>
#include <string.h>
struct element
{
int value;
int visit;
int parent_x;
int parent_y;
};
#define MAX_W 100
#define MAX_H 100
struct element data[MAX_W][MAX_H];
int start_x, start_y;
int end_x, end_y;
int M, N;
struct point
{
int x, y;
};
#define is_safe(x,y) ((x) < M && (y) < N && (x) >= 0 && (y) >= 0 && data[x][y].value == 1 && data[x][y].visit == 0)
struct point queue[MAX_W * MAX_H];
int head, tail, length;
void print_result(int x, int y)
{
int parent_x = data[x][y].parent_x;
int parent_y = data[x][y].parent_y;
if(parent_x != -1 && parent_y != -1)
{
print_result(parent_x, parent_y);
}
if(x != end_x || y != end_y)
{
printf("(%d,%d) --> ", x, y);
}
else
{
printf("(%d %d)\n", x, y);
}
}
void search(int x, int y)
{
while(length > 0)
{
struct point p = queue[head];
length--;
head = (head + 1) % (MAX_W * MAX_H);
int x = p.x;
int y = p.y;
if(x == end_x && y == end_y)
{
printf("path found!\n");
print_result(x, y);
break;
}
if(is_safe(x, y+1))
{
data[x][y+1].visit = 1;
tail = (tail + 1) %(MAX_W * MAX_H);
length++;
queue[tail].x = x;
queue[tail].y = y + 1;
data[x][y+1].parent_x = x;
data[x][y+1].parent_y = y;
}
if(is_safe(x, y-1))
{
data[x][y-1].visit = 1;
tail = (tail + 1)%(MAX_W * MAX_H);
length++;
queue[tail].x = x;
queue[tail].y = y - 1;
data[x][y-1].parent_x = x;
data[x][y-1].parent_y = y;
}
if(is_safe(x+1, y))
{
data[x+1][y].visit = 1;
tail = (tail + 1)%(MAX_W * MAX_H);
length++;
queue[tail].x = x + 1;
queue[tail].y = y;
data[x+1][y].parent_x = x;
data[x+1][y].parent_y = y;
}
if(is_safe(x-1, y))
{
data[x-1][y].visit = 1;
tail = (tail + 1)%(MAX_W * MAX_H);
length++;
queue[tail].x = x-1;
queue[tail].y = y;
data[x+1][y].parent_x = x;
data[x+1][y].parent_y = y;
}
}
}
int main(int argc, char **argv)
{
FILE *fp = freopen("data.txt", "r", stdin);
if(fp == NULL)
{
return -1;
}
scanf("%d %d", &M, &N);
memset(data, 0, sizeof(data));
int i, j;
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
{
scanf("%d", &data[i][j].value);
if(data[i][j].value == 2)
{
start_x = i;
start_y = j;
}
else if(data[i][j].value == 3)
{
end_x = i;
end_y = j;
data[i][j].value = 1;
}
}
}
data[start_x][start_y].visit = 1;
data[start_x][start_y].parent_x = -1;
data[start_x][start_y].parent_y = -1;
head = tail = length = 0;
queue[tail].x = start_x;
queue[tail].y = start_y;
length++;
search(start_x, start_y);
return 0;
}
输出结果:
path found!
(0,0) --> (1,0) --> (1,1) --> (1,2) --> (1,3) --> (1,4) --> (1,5) --> (2,5) --> (3,5) --> (4 5)