【USACO】Overfencing

2 篇文章 0 订阅
/*
ID :
LANG: C++11
TASK: maze1
 */

#include<iostream>
#include<string>
#include<queue>

using namespace std;


int main()
{
    freopen("maze1.in", "r", stdin);
    freopen("maze1.out", "w", stdout);
    char maze[210][80] ={};
    queue<pair<int, int>> bfs;
    typedef pair<int, int> coord;
    queue<int> dis;
    int tdis = 0;
    int W, H;
    cin >> W >> H;
    int exit[2] = {};
    for (int i = 0; i < 2 * H + 1; i ++){
        cin.get();
        cin.get(maze[i], 80);
        if (i == 0 || i == 2 * H){
            for (int j = 0; j < 2 * W + 1; j ++){
                if (maze[i][j] == ' '){
                    if (i == 0)
                        exit[0] = 1;
                    if (i == 2 * H)
                        exit[0] = 2 * H - 1;
                    exit[1] = j;
                    bfs.push(make_pair(exit[0], exit[1]));  dis.push(1);
                }
            }
        }
        else{
            if (maze[i][0] == ' '){
                exit[0] = i;    exit[1] = 1;    bfs.push(make_pair(exit[0], exit[1]));  dis.push(1);
            }
            else if (maze[i][2 * W] == ' '){
                exit[0] = i;    exit[1] = 2 * W - 1;    bfs.push(make_pair(exit[0], exit[1]));  dis.push(1);
            }
        }
    }



    while (!bfs.empty()){
        coord t = bfs.front();  bfs.pop();
        tdis = dis.front();    dis.pop();
        if (t.first >= 3 && maze[t.first - 1][t.second] == ' ' && maze[t.first - 2][t.second] != 'O') {//O, occupied
            maze[t.first - 2][t.second] = 'O';
            bfs.push(make_pair(t.first - 2, t.second)); dis.push(tdis + 1);
        }
        if (t.first <= 2 * H - 3 && maze[t.first + 1][t.second] == ' ' && maze[t.first + 2][t.second] != 'O') {
            maze[t.first + 2][t.second] = 'O';
            bfs.push(make_pair(t.first + 2, t.second)); dis.push(tdis + 1);
        }
        if (t.second >= 3 && maze[t.first][t.second - 1] == ' ' && maze[t.first][t.second - 2] != 'O') {
            maze[t.first][t.second - 2] = 'O';
            bfs.push(make_pair(t.first, t.second - 2)); dis.push(tdis + 1);
        }
        if (t.second <= 2 * W - 3 && maze[t.first][t.second + 1] == ' ' && maze[t.first][t.second + 2] != 'O') {
            maze[t.first][t.second + 2] = 'O';
            bfs.push(make_pair(t.first, t.second + 2)); dis.push(tdis + 1);
        }
    }
    cout << tdis << endl;
    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值