这个程序我傻乎乎的写了一晚上你敢相信?!
起因是数据结构课的队列,对没错就是数据结构。然后突然想做bfs的题,就从网上搜了一个。
就是它POJ-3107。然后没读题直接看谷歌翻译后的网页~然后不加思考的就写了。
然后本地还过了。第一发:编译错误:忘记了POJ那个SZ不认识#include<bits/stdc++.h>了。
第二发:POJ那个HD说我TLE(心里一万匹草泥马疾驰而过)。
第三发:心情低落 ,看了一会儿《女神一号》,所以没有第三发。
enmmm,当然是不可能没有第三发的啦~
没什么可说的,注意一下第一次bfs1时3位置是不能走的。
///傻乎乎地不看题意,不加思考就做题!!!
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
typedef struct Pos{
int x;
int y;
}Pos;
const int Maxn = 1010;
const int INF = 0x3f3f3f3f;
int w, h;
int Map[Maxn][Maxn];
int dis1[Maxn][Maxn];
int dis2[Maxn][Maxn];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
void bfs1(Pos p2){
queue<Pos> q;
dis1[p2.x][p2.y] = 0;
q.push(p2);
while (!q.empty()){
Pos now = q.front();q.pop();
for (int i = 0; i < 4; i ++){
Pos next;
next.x = now.x + dx[i];
next.y = now.y + dy[i];
if(next.x >=0 && next.y >= 0 && next.x < h && next.y < w && Map[next.x][next.y] != 3 && Map[next.x][next.y] != 1){
if (dis1[now.x][now.y] + 1 < dis1[next.x][next.y]){
dis1[next.x][next.y] = dis1[now.x][now.y] + 1;
q.push(next);
}
}
}
}
}
void bfs2(Pos p3){
queue<Pos> q;
dis2[p3.x][p3.y] = 0;
q.push(p3);
while (!q.empty()){
Pos now = q.front();q.pop();
for (int i = 0; i < 4; i ++){
Pos next;
next.x = now.x + dx[i];
next.y = now.y + dy[i];
if(next.x >=0 && next.y >= 0 && next.x < h && next.y < w && Map[next.x][next.y] != 1){
if (dis2[now.x][now.y] + 1 < dis2[next.x][next.y]){
dis2[next.x][next.y] = dis2[now.x][now.y] + 1;
q.push(next);
}
}
}
}
}
int main() {
Pos p3, p2;
for (int i = 0; i < Maxn; i++)
for (int j = 0; j < Maxn; j++){
dis1[i][j] = INF;
dis2[i][j] = INF;
}
scanf("%d%d", &w, &h);
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
scanf("%d", &Map[i][j]);
if (Map[i][j] == 2){
p2.x = i;
p2.y = j;
}
if (Map[i][j] == 3){
p3.x = i;
p3.y = j;
}
}
}
bfs1(p2);
bfs2(p3);
int mi = INF;
for (int i = 0; i < h; i ++){
for (int j = 0; j < w; j++){
if (Map[i][j] == 4){
if (mi > dis1[i][j] + dis2[i][j])
mi = dis1[i][j] + dis2[i][j];
}
}
}
printf("%d\n", mi);
return 0;
}
分享一句《女神一号》里的一句话:你知道一个成语吗,叫鞭长莫及?有那么长,跨过太平洋?你的思念?