[USACO2011 Open]Corn Maze玉米迷宫

Time Limit: 10 Sec Memory Limit: 128 MB

Description

今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行
。迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。在这个迷宫里,有一些神奇的
传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,机器就会强制把你送到传送点的另一头去。所有
的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。奶牛在一个单位的时间内只能向相邻的四个
方向移动一格,不过传送机传送是瞬间完成 的。现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助
她用最短的时间走出 迷宫吧。
Input

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

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

Sample Input

5 6

###=##

#.W.##

#.####

#[email protected]##

######

Sample Output

3

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

Source

Silver

解:

期望:100  实际:58

坑点:到达传送点之后强制传送

知道自己的代码水平还是太弱。

一定要加油啊。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 const int N=500;
 6 int n,m,sx,sy,tx,ty;
 7 int b[N][N],l[N][3],to[N][3];
 8 char s[N];
 9 int d[N][N],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
10 int fx,fy,rx,ry,tmp,cnt;
11 queue<int>qx,qy;
12 void bfs()
13 {
14     d[tx][ty]=0;
15     qx.push(tx);qy.push(ty);
16     while(!qx.empty())
17     {
18         fx=qx.front();qx.pop();
19         fy=qy.front();qy.pop();
20         for(int i=0;i<=3;++i)
21         {
22             rx=fx+dx[i];ry=fy+dy[i];
23             if(rx<1 || rx>n || ry<1 || ry>m) continue;
24             if(!b[rx][ry]) continue;
25             if(b[rx][ry]>1)
26             {
27                 tmp=b[rx][ry];
28                 rx=to[tmp][1];ry=to[tmp][2];
29             }
30             if(d[rx][ry]>d[fx][fy]+1)
31             {
32                 d[rx][ry]=d[fx][fy]+1;
33                 qx.push(rx),qy.push(ry);
34             }
35         }
36     }
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&m);
41     cnt=4;
42     for(int i=1,u;i<=n;++i)
43     {
44         scanf("%s",s+1);
45         for(int j=1;j<=m;++j)
46         {
47             if(s[j]==‘@‘) sx=i,sy=j,b[i][j]=1;
48             else if(s[j]==‘.‘) b[i][j]=1;
49             else if(s[j]==‘=‘) tx=i,ty=j,b[i][j]=1;
50             else if(s[j]==‘#‘) b[i][j]=0;
51             else {
52                 u=s[j];
53                 if(l[u][0]==0) l[u][0]=++cnt,l[u][1]=i,l[u][2]=j;
54                 else{
55                     cnt++;
56                     to[cnt][1]=l[u][1];to[cnt][2]=l[u][2];
57                     to[l[u][0]][1]=i,to[l[u][0]][2]=j;
58                 }
59                 b[i][j]=cnt;
60             }
61         }
62     }
63     for(int i=1;i<=n;++i)
64      for(int j=1;j<=m;++j)
65       d[i][j]=1e9;
66     bfs();
67     printf("%d",d[sx][sy]);
68     return 0;
69 }

原文地址:https://www.cnblogs.com/adelalove/p/8569290.html

时间: 2024-10-13 14:17:42

[USACO2011 Open]Corn Maze玉米迷宫的相关文章

3299: [USACO2011 Open]Corn Maze玉米迷宫

3299: [USACO2011 Open]Corn Maze玉米迷宫 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 137  Solved: 59[Submit][Status][Discuss] Description 今年秋天,约翰带着奶牛们去玩玉米迷宫.迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行. 迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口. 在这个迷宫里,有一些神奇的传送点6每个传送点

【bzoj 3299】 [USACO2011 Open]Corn Maze玉米迷宫(最短路)

就一个最短路,并且边长都是1,所以每个点只搜一次. 1 /************************************************************** 2 Problem: 3299 3 User: MT_Chan 4 Language: C++ 5 Result: Accepted 6 Time:72 ms 7 Memory:2420 kb 8 ***********************************************************

洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from one point in

[USACO11OPEN]玉米田迷宫Corn Maze

题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from one point in the maze to another. The slides w

【luogu P1825 [USACO11OPEN]玉米田迷宫Corn Maze】 题解

题目链接:https://www.luogu.org/problemnew/show/P1825 带有传送门的迷宫问题 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 2001; char map[maxn][maxn]; int fx[4] = {0, 1, 0, -1};

[uva11OPEN]玉米田迷宫Corn Maze(广搜bfs)

第一次做MLE了…第二次WA了5个点,其实就是一个判断错了…QAQ总的来说…是个水题/板子题(逃 #include<bits/stdc++.h> using namespace std; #define For(i,l,r) for(register int i=l; i<r; i++) int n,m; int d[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 }; bool bj,vis[301][301]; char ch[301][301]; struct

[LeetCode] The Maze III 迷宫之三

There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolling up (u), down (d), left (l) or right (r), but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction. T

[LeetCode] The Maze II 迷宫之二

There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolling up, down, left or right, but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction. Given the ball's 

uva 705 Slash Maze 斜线迷宫

唉,上午一直不在状态,都没有好好思考,基本上算是看的题解,切记做题一定要专注,一定要多思考,不能轻易的看题解了,这道题可以把'/'和'\'转化,用0和1表示, '/'表示为 : '\'表示为 001 100 010 010 100 001 相当于扩大了三倍,最后结果除以三就ok了 然后就可以用普通的搜索求了,还是连通问题,注意一点只要是遍历到处于边缘的0就说明这个一定不是环,wa了一次,还是没注意到每组案例之间都有一个空行:休息会,再奋战. 上代码:(基本上跟别人写的一样) #include<s