usaco Overfencing 穿越栅栏(BFS)
生活随笔
收集整理的這篇文章主要介紹了
usaco Overfencing 穿越栅栏(BFS)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Overfencing 穿越柵欄
農(nóng)夫 John 在外面的田野上搭建了一個巨大的用柵欄圍成的迷宮.幸運的是,他在迷宮的邊界上留出
了兩段柵欄作為迷宮的出口.更幸運的是,他所建造的迷宮是一個“完美的”迷宮:即你能從迷宮中
的任意一點找到一條走出迷宮的路.
給定迷宮的寬 W(1<=W<=38)及長 H(1<=H<=100).
2*H+1行,每行2*W+1的字符以下面給出的格式表示一個迷宮.然后計算從迷宮中最“糟糕”的那一
個點走出迷宮所需的步數(shù).(即使從這一點以最優(yōu)的方式走向最靠近的出口,它仍然需要最多的步
數(shù))當然了,牛們只會水平或垂直地在 X 或 Y 軸上移動,他們從來不走對角線.每移動到一個新的方
格算作一步(包括移出迷宮的那一步)
這是一個 W=5,H=3 的迷宮:
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
如上圖的例子,柵欄的柱子只出現(xiàn)在奇數(shù)行或奇數(shù)列.每個迷宮只有兩個出口.
PROGRAM NAME: maze1
INPUT FORMAT
第一行: W 和 H(用空格隔開)
第二行至第 2*H+2 行: 每行 2*W+1 個字符表示迷宮
SAMPLE INPUT (file maze1.in)
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
OUTPUT FORMAT
輸出一個單獨的整數(shù),表示能保證牛從迷宮中任意一點走出迷宮的最小步數(shù).
SAMPLE OUTPUT (file maze1.out)
農(nóng)夫 John 在外面的田野上搭建了一個巨大的用柵欄圍成的迷宮.幸運的是,他在迷宮的邊界上留出
了兩段柵欄作為迷宮的出口.更幸運的是,他所建造的迷宮是一個“完美的”迷宮:即你能從迷宮中
的任意一點找到一條走出迷宮的路.
給定迷宮的寬 W(1<=W<=38)及長 H(1<=H<=100).
2*H+1行,每行2*W+1的字符以下面給出的格式表示一個迷宮.然后計算從迷宮中最“糟糕”的那一
個點走出迷宮所需的步數(shù).(即使從這一點以最優(yōu)的方式走向最靠近的出口,它仍然需要最多的步
數(shù))當然了,牛們只會水平或垂直地在 X 或 Y 軸上移動,他們從來不走對角線.每移動到一個新的方
格算作一步(包括移出迷宮的那一步)
這是一個 W=5,H=3 的迷宮:
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
如上圖的例子,柵欄的柱子只出現(xiàn)在奇數(shù)行或奇數(shù)列.每個迷宮只有兩個出口.
PROGRAM NAME: maze1
INPUT FORMAT
第一行: W 和 H(用空格隔開)
第二行至第 2*H+2 行: 每行 2*W+1 個字符表示迷宮
SAMPLE INPUT (file maze1.in)
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
OUTPUT FORMAT
輸出一個單獨的整數(shù),表示能保證牛從迷宮中任意一點走出迷宮的最小步數(shù).
SAMPLE OUTPUT (file maze1.out)
9
把兩個門加到隊列里一起bfs用setup記錄達到某點的步數(shù)(順便可以當vis數(shù)組使用防止重走)最后到達那個最遠點的步數(shù)就是要求的答案。我在判斷到門的時候把門轉(zhuǎn)為迷宮中的格子然后加入隊列并使那點的setup為1.
/*
ID: jinbo wu
TASK:maze1
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
char a[250][100];
int dir[4][2]={2,0,0,2,-2,0,0,-2};
int ex[2],ey[2];
int w,h;
struct node
{int x,y;
}temp;
int setup[250][100];
bool can(int x,int y,int c,int d)
{if(c>=0&&c<2*h+1&&d>=0&&d<2*w+1&&a[x][y]==' ')return true;return false;
}
queue<node> q;
int bfs()
{node t1,t2;int ans=0;while(!q.empty()){t2=q.front();q.pop();if(ans<setup[t2.x][t2.y])ans=setup[t2.x][t2.y];for(int i=0;i<4;i++){t1.x=t2.x+dir[i][0];t1.y=t2.y+dir[i][1];int xx=t2.x+dir[i][0]/2;int yy=t2.y+dir[i][1]/2;if(can(xx,yy,t1.x,t1.y)&&!setup[t1.x][t1.y]){setup[t1.x][t1.y]=setup[t2.x][t2.y]+1;q.push(t1);}}}return ans;}
int main()
{freopen("maze1.in","r",stdin);freopen("maze1.out","w",stdout);cin>>w>>h;int l=0;getchar();for(int i=0;i<2*h+1;i++){for(int j=0;j<2*w+1;j++){scanf("%c",&a[i][j]);if(((i==0||i==2*h)||(j==0||j==2*w))&&(a[i][j]==' ')){int dx=i,dy=j;if(i==0) dx+=1;if(j==0) dy+=1;if(i==2*h) dx-=1;if(j==2*w) dy-=1;temp.x=dx,temp.y=dy;setup[dx][dy]=1;q.push(temp);}}getchar();}int ans=bfs();cout<<ans<<endl;
}
總結(jié)
以上是生活随笔為你收集整理的usaco Overfencing 穿越栅栏(BFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机进水维修费用大概多少
- 下一篇: usaco Cow Tours 牛的旅行