使用DFS解决,1可以看成已经访问过的,0可以看成没有访问过的:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct Edge{
int x, y;
Edge(int x, int y): x(x), y(y){}
};
vector< vector<Edge> > v;
int matrix[5][5];
int pos[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(int x1, int y1, int x2, int y2, vector<Edge> v1){
if(x1 == x2 && y1 == y2) v.push_back(v1);
else{
for(int i = 0; i < 4; i++){
int nx = x1 + pos[i][0];
int ny = y1 + pos[i][1];
if(nx < 0 || nx > 4 || ny < 0 || ny > 4 || matrix[nx][ny] == 1) continue;
matrix[nx][ny] = 1;
vector<Edge> v2(v1);
v2.push_back(Edge(nx, ny));
dfs(nx, ny, x2, y2, v2);
matrix[nx][ny] = 0;
}
}
}
int main(){
for(int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) scanf("%d", &matrix[i][j]);
}
vector<Edge> v1;
v1.push_back(Edge(0, 0));
matrix[0][0] = 1;
dfs(0, 0, 4, 4, v1);
int minimum = 0;
for(int i = 0; i < v.size(); i++){
if(v[i].size() < v[minimum].size()) minimum = i;
}
for(int i = 0; i < v[minimum].size(); i++){
printf("(%d, %d)\n", v[minimum][i].x, v[minimum][i].y);
}
return 0;
}