#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; }