解题思路
深度优先搜索(回溯法)
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<vector<pair<int, int>>> result;
vector<pair<int, int>> paths;
void dfs(vector<vector<int>>& matrix, int n, int m, int i, int j)
{
matrix[i][j] = 1;
paths.push_back(pair(i, j));
// 到终点了
if(i == n-1 && j == m-1)
{
result.push_back(paths);
return;
}
// 往4个方向走
// 上
if(i - 1 >= 0 && matrix[i-1][j] == 0)
{
dfs(matrix, n, m, i-1, j);
}
// 下
if(i + 1 < n && matrix[i+1][j] == 0)
{
dfs(matrix, n, m, i+1, j);
}
// 左
if(j - 1 >= 0 && matrix[i][j-1] == 0)
{
dfs(matrix, n, m, i, j-1);
}
// 右
if(j + 1 < m && matrix[i][j+1] == 0)
{
dfs(matrix, n, m, i, j+1);
}
matrix[i][j] = 0;
paths.pop_back();
return;
}
int main()
{
while(cin >> n >> m)
{
int i, j;
vector<vector<int>> matrix(n, vector(m, 0));
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
cin >> matrix[i][j];
}
}
paths.clear();
dfs(matrix, n, m, 0, 0);
// 输出result
for(i = 0; i < result[0].size(); i++)
{
cout << "(" << result[0][i].first << "," << result[0][i].second << ")" << endl;
}
}
return 0;
}
// 64 位输出请用 printf("%lld")