输入数据中, 0表示不能通过,1为可以通过,2为起点,3为终点。
例子数据如下:
6 6
2 0 0 0 0 0
1 1 1 1 1 1
0 1 0 1 0 1
0 1 0 1 0 1
1 1 1 0 1 3
0 0 1 1 1 0
第一行的 6 6 表示输入矩形的宽和高。
代码实现如下:
#include <stdio.h>
#include <string.h>
struct element
{
int value;
int visit;
};
#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;
};
struct point solution[MAX_W * MAX_H];
int idx;
#define is_safe(x,y) ((x) < M && (y) < N && (x) >= 0 && (y) >= 0 && data[x][y].value == 1 && data[x][y].visit == 0)
void print_result(void)
{
int i = 0;
while (i <= idx)
{
printf("(%d,%d)", solution[i].x, solution[i].y);
if(i < idx)
{
printf("-->");
}
i++;
}
printf("\n");
}
void search(int x, int y)
{
if(x == end_x && y == end_y)
{
printf("path found!\n");
print_result();
return;
}
if(is_safe(x+1, y))
{
data[x+1][y].visit = 1;
idx++;
solution[idx].x = x + 1;
solution[idx].y = y;
search(x+1, y);
return;
}
else if(is_safe(x-1, y))
{
data[x-1][y].visit = 1;
idx++;
solution[idx].x = x -1 ;
solution[idx].y = y;
search(x-1, y);
return;
}
//search rightward
else if(is_safe(x, y+1))
{
data[x][y+1].visit = 1;
idx++;
solution[idx].x = x;
solution[idx].y = y + 1;
search(x, y+1);
return;
}
else if(is_safe(x, y - 1))
{
data[x][y-1].visit = 1;
idx++;
solution[idx].x = x;
solution[idx].y = y - 1;
search(x, y -1);
return;
}
data[x][y].visit == 0;
idx--;
}
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;
idx = 0;
solution[idx].x = 0;
solution[idx].y = 0;
search(start_x, start_y);
return 0;
}
输出:
(0 0)-->(1 0)-->(1 1)-->(2 1)-->(3 1)-->(4 1)-->(4 2)-->(5 2)-->(5 3)-->(5 4)-->(4 4)-->(4 5)
这种方法只能找到一个路径,而且不能保证是最短的。
References:
1. http://www.geeksforgeeks.org/backttracking-set-2-rat-in-a-maze/
2. https://www.cs.bu.edu/teaching/alg/maze/
3. https://courses.cs.washington.edu/courses/cse143/12wi/lectures/02-17/17-recursive-backtracking-2.pdf