POJ-3107了解一下

这个程序我傻乎乎的写了一晚上你敢相信?!

起因是数据结构课的队列,对没错就是数据结构。然后突然想做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;
}


分享一句《女神一号》里的一句话:你知道一个成语吗,叫鞭长莫及?有那么长,跨过太平洋?你的思念?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值