迷宫问题
原题链接
题解
因为每一条边的权重都是1,所以可以使用bfs查找最短路径,题目中要求的要记录最短路径并打印出来,利用一个二维数组记录该点是由哪一个点拓展而来(bfs找到的时候就是最短路径)
代码如下
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <map>
#include <queue>
#include <sstream>
#include <set>
#include <cctype>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef pair<int, int> PII;
const int N = 10;
int g[N][N];
int d[N][N];
PII q[N * N], st[N][N];//st是记录到底的点的上一个点的坐标是什么
int dx[4]={0,0,-1,1},dy[4]{-1,1,0,0};
vector<PII> bfs(){
int hh = 0, tt = 0;
while(hh <= tt){
auto t = q[hh ++];
for(int i = 0; i < 4; ++i){
int x = t.first + dx[i], y = t.second + dy[i];
if(x >= 0 && x < 5 && y >= 0 && y < 5 && g[x][y] == 0 && d[x][y] == 0){
d[x][y] = 1;
st[x][y] = t;//记录这个点是由哪个点拓展的
q[++ tt] = {x, y};
}
}
}
vector<PII> res;
int x = 4, y = 4;
while(x || y){
res.push_back({x,y});
auto t = st[x][y];
x = t.first, y = t.second;
}
res.push_back({0,0});
reverse(res.begin(), res.end());
return res;
}
int main(){
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j)
cin >> g[i][j];
vector<PII> res = bfs();
for(int i = 0; i < res.size(); ++i){
cout << "(" << res[i].first << ", " << res[i].second << ")" << endl;
}
return 0;
}
这个题目还可以使用dfs做,但是找到一条路径的时候不一定是最短路径,所以要把所有的路径找到之后,进行比较
代码如下
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
vector<PII> res;
int g[10][10];
bool st[10][10];
int dx[4]{0,0,1,-1}, dy[4]{1,-1,0,0};
void dfs(int x, int y, vector<PII> ans){
if(x == 4 && y == 4){
if(ans.size() < res.size() || res.size() == 0) res = ans;
return;
}
for(int i = 0; i < 4; ++i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5 || g[nx][ny] == 1 || st[nx][ny] == 1) continue;
ans.push_back({nx,ny});
st[nx][ny] = 1;
dfs(nx, ny, ans);
ans.pop_back();
st[nx][ny] = 0;
}
}
int main(){
for(int i = 0; i < 5; ++i){
for(int j = 0; j < 5; ++j)
scanf("%d",&g[i][j]);
}
st[0][0] = 1;
dfs(0,0,{1,{0,0}});
for(auto it1 : res){
cout << "(" << it1.first << ", " << it1.second << ")" << endl;
}
return 0;
}
注意原题中因为是POJ(POJ比较的年代久远了)中的题目,所以有的语法不支持
如有错误,欢迎指正!