题目描述
用一个m×n的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对给定的迷宫,求出找到的第一条从入口到出口的通路,或得到没有通路的结论。
我们指定:
(1) 迷宫的入口为矩阵的左上角(1,1),迷宫的出口为右下角(m,n);
(2) 路径的探索顺序依次为"东南西北"(即:右下左上)。
输入
第一行输入两个整数,空格间隔,分别表示矩阵的行数m和列数n;
接下来的连续m行,输入迷宫矩阵的信息。
输出
求得的通路以三元组(i,j,d)的形式输出。
其中:
i,j指示迷宫的一个坐标;
d表示走到下一坐标的方向(数字1表示东,数字2表示南,数字3表示西,数字4表示北);
终点d值为0。
样例输入
9 8
00100010
00100010
00001101
01110010
00010000
01000101
01111001
11000101
11000000
样例输出
(1,1,1)(1,2,2)(2,2,2)(3,2,3)(3,1,2)(4,1,2)(5,1,1)(5,2,1)(5,3,2)(6,3,1)(6,4,1)(6,5,4)(5,5,1)(5,6,1)(5,7,2)(6,7,2)(7,7,2)(8,7,2)(9,7,1)(9,8,0)
代码
#include<stdlib.h>
#include<stdio.h>
typedef struct Stack
{
int row;
int col;
int dir;
struct Stack* next;
struct Stack* top;
}stack;
stack* InitStack()
{
stack* s = (stack*)malloc(sizeof(stack));
s->next = NULL;
s->top = NULL;
return s;
}
void Input(stack** s, int r, int c, int d)
{
stack* n = (stack*)malloc(sizeof(stack));
n->next = NULL;
n->row = r;
n->col = c;
n->dir = d;
n->top = *s;
(*s)->next = n;
(*s) = n;
}
void Output(stack** s)
{
if ((*s)->top == NULL)
{
printf("??");
system("pause");
exit(0);
}
stack* p = (*s);
(*s) = (*s)->top;
(*s)->next = NULL;
free(p);
}
void FindWay(stack** s, char** board, int r, int c, int m, int n)
{
if ((c + 1 < n) && (board[r][c + 1] == '0'))
{
(*s)->dir = 1;
c = c + 1;
board[r][c] = '*';
Input(s, r, c, 0);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
else
{
FindWay(s, board, r, c, m, n);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
Output(s);
r = (*s)->row;
c = (*s)->col;
}
}
if ((r + 1 < m) && (board[r + 1][c] == '0'))
{
(*s)->dir = 2;
r = r + 1;
board[r][c] = '*';
Input(s, r, c, 0);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
else
{
FindWay(s, board, r, c, m, n);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
Output(s);
r = (*s)->row;
c = (*s)->col;
}
}
if ((c - 1 > -1) && (board[r][c - 1] == '0'))
{
(*s)->dir = 3;
c = c - 1;
board[r][c] = '*';
Input(s, r, c, 0);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
else
{
FindWay(s, board, r, c, m, n);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
Output(s);
r = (*s)->row;
c = (*s)->col;
}
}
if ((r - 1 > -1) && (board[r - 1][c] == '0'))
{
(*s)->dir = 4;
r = r - 1;
board[r][c] = '*';
Input(s, r, c, 0);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
else
{
FindWay(s, board, r, c, m, n);
if (((*s)->row == m - 1) && ((*s)->col == n - 1))
return;
Output(s);
r = (*s)->row;
c = (*s)->col;
}
}
}
int main()
{
stack* s;
stack* head;
int m = 0;
int n = 0;
int i = 0;
int r = 0;
int c = 0;
scanf("%d%d", &m, &n);
char **board = (char**)malloc(m * sizeof(char*));
for (i = 0; i < m; i++)
{
board[i] = (char*)malloc(n * sizeof(char));
scanf("%s", board[i]);
}
board[0][0] = '*';
s = InitStack();
head = s;
Input(&s, 0, 0, 0);
FindWay(&s, board, r, c, m, n);
head = head->next;
while (head != NULL)
{
printf("(%d,%d,%d)", head->row + 1, head->col + 1, head->dir);
head = head->next;
}
return 0;
}