赞
踩
从迷宫入口开始进行dfs搜索,每次进入一个点,将其加入临时路径数组中,把该位改成0表示不能进入,然后依次搜索该位下、右、上、左四个方向的点,如果搜索的这个点可以进入则路径进入,如果四个方向都没有可以走的路表示此路不通,回溯——删去路径最后一个,重置该位为0. 找到横纵坐标都等于矩阵最后一位则表示找到路径,复制现有路径然后返回。
#include<iostream> #include<vector> using namespace std; vector<pair<int,int>> res; void dfs(vector<vector<int>>& matrix, int n, int m, int i, int j, vector<pair<int,int>>& paths) { //在每次递归调用时,程序首先将当前位置 (i, j) 记录到 paths 中,并将该位置标记为已经访问过。然后检查是否到达终点 (n-1, m-1),如果到达终点则将路径保存到全局变量 res 中,并返回。 paths.push_back(make_pair(i, j)); matrix[i][j] = 1; if (i == n - 1 && j == m - 1) { res = paths; return; } //向下、向右、向上、向左。对于每个方向,判断是否在迷宫范围内且可以通行(值为0),如果满足条件则递归调用 dfs 继续搜索。 if (i + 1 < n && matrix[i + 1][j] == 0) { //下 dfs(matrix, n, m, i + 1, j, paths); } if (j + 1 < m && matrix[i][j + 1] == 0) { //右 dfs(matrix, n, m, i, j + 1, paths); } if (i - 1 >= 0 && matrix[i - 1][j] == 0) { //上 dfs(matrix, n, m, i - 1, j, paths); } if (j - 1 >= 0 && matrix[i][j - 1] == 0) { //左 dfs(matrix, n, m, i, j - 1, paths); } paths.pop_back(); matrix[i][j] = 0; } int main() { int n, m; while (cin >> n >> m) { vector<vector<int>> matrix(n, vector<int>(m,0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> matrix[i][j]; } } vector <pair<int, int >> paths; dfs(matrix, n, m, 0, 0, paths); for (int i = 0; i < res.size(); ++i) { cout << "(" << res[i].first << "," << res[i].second << ")" << endl; } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。