#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 搜寻函数,用于对矩阵进行处理
void search(int** arr, int x, int y, int m, int n, char*** stack, int* top,
char*** resstack, int* restop) {
// 对当前位置的元素,先假设它能走得通,对于走得通的元素,
// 将其值改为1,标记其已经走过,防止下次寻找时再次走到这个位置
arr[x][y] = 1;
// 将当前的字符串先入栈,后面如果发现当前位置不合适的话,再弹栈
sprintf((*stack)[(*top)++], "(%d,%d)", x, y);
if (x == m - 1 && y == n - 1) { // 当前位置是最后一个位置
// 将当前的stack复制到保存结果的栈resstack中
// 在后续递归返回时,stack会被改变
for (*restop = 0; (*restop) < (*top); (*restop)++) {
strcpy((*resstack)[*restop], (*stack)[*restop]);
}
return;
}
// 按照上->右->下->左的顺序依次寻找可以走的路径
// 是多个if而不是if else,因为当发现位置不合适需要回溯时,else部分将不会再执行,
// 即回溯时将不再查看当前位置的其他可能位置,即上下左右四个方向将只会寻找一个方向,
// 只有用4个if才会在回溯时将四个方向全都找一遍
if (x - 1 >= 0 && arr[x - 1][y] == 0) { //上
search(arr, x - 1, y, m, n, stack, top, resstack, restop);
}
if (y + 1 < n && arr[x][y + 1] == 0) { //右
search(arr, x, y + 1, m, n, stack, top, resstack, restop);
}
if (x + 1 < m && arr[x + 1][y] == 0) { //下
search(arr, x + 1, y, m, n, stack, top, resstack, restop);
}
if (y - 1 >= 0 && arr[x][y - 1] == 0) { //左
search(arr, x, y - 1, m, n, stack, top, resstack, restop);
}
// 如果上下左右四个方向全都不可以,则需要进行回溯(利用递归来回溯),stac要弹栈
--(*top);
}
int main(void) {
// 读取输入
// 读取行列
int m, n; // m行,n列
scanf("%d %d", &m, &n);
// 定义二维数组
int** arr = (int**)malloc(sizeof(int*) * m);
for (int i = 0; i < m; i++)
arr[i] = (int*)malloc(sizeof(int) * n);
// 读取二维数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
// 定义两个栈,用于对数组进行处理
// 定义第一个栈,用于寻找
char** stack = (char**)malloc(sizeof(char*) * 40);
for (int i = 0; i < 40; i++) {
stack[i] = (char*)malloc(sizeof(char) * 10);
}
int top = 0;
// 定义第二个栈,用于返回结果
char** res = (char**)malloc(sizeof(char*) * 40);
for (int i = 0; i < 40; i++) {
res[i] = (char*)malloc(sizeof(char) * 10);
}
int restop = 0;
// 调用搜寻函数进行处理
search(arr, 0, 0, m, n, &stack, &top, &res, &restop);
// 打印结果,结果保存在用于返回结果的第二个栈中
for (int i = 0; i < restop; i++)
puts(res[i]);
return 0;
}