zoukankan      html  css  js  c++  java
  • 【BZOJ】3299: [USACO2011 Open]Corn Maze玉米迷宫(bfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3299

    映射一下传送门即可。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr2(a, b, c) for1(i, 1, b) { for1(j, 1, c) cout << a[i][j]; cout << endl; }
    #define printarr1(a, b) for1(i, 1, b) cout << a[i]; cout << endl
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=1105, oo=~0u>>2, Q=N*N, dx[]={-1, 1, 0, 0}, dy[]={0, 0, -1, 1};
    int mp[N][N], n, m, d[N][N], X, Y, XX, YY, front, tail;
    struct dat { int x, y; }q[Q];
    struct HS { int x[2], y[2]; }hs[51];
    
    void bfs() {
    	q[tail].x=X, q[tail++].y=Y;
    	for1(i, 1, n) for1(j, 1, m) d[i][j]=oo;
    	d[X][Y]=0;
    	while(front!=tail) {
    		dat &t=q[front++]; if(front==Q) front=0;
    		int x=t.x, y=t.y;
    		if(XX==x && YY==y) continue;
    		rep(i, 4) {
    			int fx=dx[i]+x, fy=dy[i]+y;
    			if(fx<1 || fy<1 || fx>n || fy>m || mp[fx][fy]==1) continue;
    			if(mp[fx][fy]>=4) {
    				int h=mp[fx][fy], pos=(hs[h].x[0]==fx && hs[h].y[0]==fy);
    				fx=hs[h].x[pos], fy=hs[h].y[pos];
    			}
    			if(d[fx][fy]>d[x][y]+1) {
    				dat &t2=q[tail++]; if(tail==Q) tail=0;
    				t2.x=fx, t2.y=fy; d[fx][fy]=d[x][y]+1;
    			}
    		}
    	}
    }
    
    int main() {
    	read(n); read(m);
    	for1(i, 1, 50) CC(hs[i].x, 0), CC(hs[i].y, 0);
    	for1(i, 1, n) for1(j, 1, m) {
    		char ch=getchar(); while(ch=='
    ' || ch=='') ch=getchar();
    		if(ch=='#') mp[i][j]=1;
    		else if(ch=='=') mp[i][j]=2, XX=i, YY=j;
    		else if(ch=='@') mp[i][j]=3, X=i, Y=j;
    		else if(ch>='A'&&ch<='Z') {
    			int t=4+ch-'A', pos=(hs[t].x[0]!=0);
    			hs[t].x[pos]=i; hs[t].y[pos]=j;
    			mp[i][j]=t;
    		}
    	}
    	bfs();
    	print(d[XX][YY]);
    	return 0;
    }
    

    Description

    今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行。
    迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。
    在这个迷宫里,有一些神奇的传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,
    机器就会强制把你送到传送点的另一头去。所有的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。

    奶牛在一个单位的时间内只能向相邻的四个方向移动一格,不过传送机传送是瞬间完成 的。
    现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助她用最短的时间走出 迷宫吧。

    Input

    第一行:两个用空格分开的整数:N和M,2
    第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。其中"#"代 表不能通行的玉米地,
    "."代表可以通行的草地,"@"代表贝西的起始位罝,"="代表迷宫出口,
    大写字母“A”到“Z”总是成对出现的,代表一对传送点

    Output

     

    第一行:一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在

    Sample Input


    5 6
    ###=##
    #.W.##
    #.####
    #.@W##
    ######

    Sample Output

    3

    HINT

    从起点向右走,通过w传送,再从另一端 走出迷宫

    Source

  • 相关阅读:
    UVA11367 Full Tank?
    不均衡样本集问题
    NLP interview
    Linux 指令
    Python 趣题
    Grid Illumination
    动态规划-Minimum Cost to Merge Stones
    Contest 141
    Python join()方法
    Single Number
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3979937.html
Copyright © 2011-2022 走看看