#include <stdio.h>
#include <stdbool.h>
#define MAX 100
// 定义迷宫的行数和列数为全局变量
int m, n;
// 判断当前位置是否合法
bool isValid(int maze[][MAX], int x, int y)
{
if (x < 0 || y < 0 || x >= m || y >= n || maze[x][y] == 1)
return false;
return true;
}
// DFS遍历迷宫寻找路径
bool dfs(int maze[][MAX], int path[][2], int x, int y, int end_x, int end_y)
{
// 如果当前位置是终点,则找到路径,终止递归
if (x == end_x && y == end_y)
return true;
// 如果当前位置合法,则标记该位置已经访问过,并保存该位置的坐标到路径中
if (isValid(maze, x, y))
{
maze[x][y] = 1;
path[x][y] = 1;
// 递归尝试向上下左右四个方向移动
if (dfs(maze, path, x-1, y, end_x, end_y) // 上
|| dfs(maze, path, x+1, y, end_x, end_y) // 下
|| dfs(maze, path, x, y-1, end_x, end_y) // 左
|| dfs(maze, path, x, y+1, end_x, end_y)) // 右
{
return true;
}
// 如果四个方向都不可行,则将当前位置从路径中移除,并返回上一步
path[x][y] = 0;
}
return false;
}
int main()
{
int maze[MAX][MAX];
int path[MAX][2] = {0}; // 保存路径的坐标,默认为0
// 输入迷宫的行数和列数
scanf("%d %d", &m, &n);
// 输入迷宫的内容
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &maze[i][j]);
}
}
int start_x, start_y, end_x, end_y;
// 输入起点和终点的坐标
scanf("%d %d %d %d", &start_x, &start_y, &end_x, &end_y);
// 调用dfs函数来查找路径
if (dfs(maze, path, start_x, start_y, end_x, end_y))
{
// 输出路径的坐标
printf("(%d %d)", start_x, start_y);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (path[i][j] == 1)
printf("(%d %d)", i, j);
}
}
printf("\n");
}
else
{
printf("No Path!\n");
}
return 0;
}