题目链接:
一、读题题意:蒜头君要回家,但是他没有钥匙,他需要在图中先找到钥匙,然后再拿着钥匙回家,问蒜头君回到家的最短路。
二、建模(一)n*m的网格
由网格我们可以想到搜索算法
(二)最短路
要求最短路,DFS和BFS都可以,但是按照复杂度来看,DFS会超时,所以选用BFS
三、编码代码分三个部分:BFS、输入、调用BFS
(一)BFS
int n, m, ans=2e9,cnt=0;
int vis[maxn][maxn];
char map[maxn][maxn];
int sx,sy,tx,ty;
int d1[maxn][maxn];
int d2[maxn][maxn];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
struct node {
int x, y, step;
};
int bfs1(int x, int y) {
queue < node > que;
node q, p;
q.x = x, q.y = y, q.step = 0;
vis[x][y] = 1;
que.push(q);
while (!que.empty()) {
p = que.front();
que.pop();
if (cnt>=n*m) {
return p.step;
}
for (int i = 0; i < 4; i++) {
q.x = p.x + dir[i][0];
q.y = p.y + dir[i][1];
q.step = p.step + 1;
if (q.x >= 1 && q.x <= n && q.y >= 1 && q.y <= m && !vis[q.x][q.y] && map[q.x][q.y]!='#') {
vis[q.x][q.y] = 1;
que.push(q);
d1[q.x][q.y]=q.step;
cnt++;
}
}
}
return -1; //没有合法路径
}
int bfs2(int x, int y) {
queue < node > que;
node q, p;
q.x = x, q.y = y, q.step = 0;
vis[x][y] = 1;
que.push(q);
while (!que.empty()) {
p = que.front();
que.pop();
if (cnt>=n*m) {
return p.step;
}
for (int i = 0; i < 4; i++) {
q.x = p.x + dir[i][0];
q.y = p.y + dir[i][1];
q.step = p.step + 1;
if (q.x >= 1 && q.x <= n && q.y >= 1 && q.y <= m && !vis[q.x][q.y] && map[q.x][q.y]!='#') {
vis[q.x][q.y] = 1;
que.push(q);
d2[q.x][q.y]=q.step;
cnt++;
}
}
}
return -1; //没有合法路径
}
BFS基础代码,只是把结束条件改成了遍历全图
(二)输入
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>map[i][j];
if(map[i][j]=='S'){
sx=i;
sy=j;
}
if(map[i][j]=='T'){
tx=i;
ty=j;
}
}
(三)调用BFS
bfs1(sx,sy);
cnt=0;
memset(vis,0,sizeof(vis));
bfs2(tx,ty);
(EXTRA)调试代码
for(int i=1;i<=n;i++,cout<<endl)
for(int j=1;j<=m;j++)
cout<<d1[i][j]<<"\t";
cout<<endl;
for(int i=1;i<=n;i++,cout<<endl)
for(int j=1;j<=m;j++)
cout<<d2[i][j]<<"\t";
感谢支持!