Overfencing 穿越栅栏

xiaoxiao2021-02-28  136

题目如下: 农夫John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫.然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X 或Y 轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3 的

5 3 +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+

如上图的例子,栅栏的柱子只出现在奇数行或奇数列.每个迷宫只有两个出口。 INPUT FORMAT 第一行: W 和H(用空格隔开) 第二行至第2*H+2行: 每行2*W+1个字符表示迷宫 SAMPLE INPUT (file maze1.in)

5 3 +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+

OUTPUT FORMAT 输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。 SAMPLE OUTPUT (file maze1.out) 9

这一到题我的是思路是bfs从迷宫的出口进行BFS,选取的最小值,最后在两个循环找到最大值

代码如下:

#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> using namespace std; int h,w,js=1,ans=0; char a[500][500]; int bj[3],b[3],dj[10000],dj1[10000],dj2[10000]; int f[500][500],n,m; bool l[500][500]; int fx[10]= {0,0,0,1,-1}; int fy[10]= {0,1,-1,0,0}; int bfs(int x,int y) { int head=0,tail=1; dj[1]=x; dj1[1]=y; dj2[1]=0; do { head++; for(int i=1; i<=4; i++) { x=dj[head]+fx[i]; y=dj1[head]+fy[i]; if(a[x][y]==' '&&x>0&&x<=n&&y>0&&y<=m&&l[x][y]==0) {//判断这点是不是在迷宫里面或为不为空格 tail++; f[x][y]=min(f[x][y],dj2[head]+1);//坐标为(x,y)的点到迷宫的最短路径 dj[tail]=x; dj1[tail]=y; dj2[tail]=dj2[head]+1; l[x][y]=1;//标记坐标为(x,y)的点 } } } while(head<tail);//当头<尾时循环 } int main() { for(int i=1; i<=500; i++) for(int j=1; j<=500; j++) f[i][j]=10000;//把f数组赋一个很大的值 cin>>w>>h;//输入 char c; n=2*h+1; m=2*w+2; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%c",&a[i][j]);//字符输入 if((i==1||j==2||i==n||j==m)&&a[i][j]==' ') {//寻找迷宫出口 b[js]=i;//标记出口的坐标i bj[js]=j;//标记出口的坐标j js++; } } } int ja=0; for(int i=1; i<js; i++) {//枚举迷宫出口 memset(l,0,sizeof(l));//把l数组清空 bfs(b[i],bj[i]);//开始搜索 } for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(f[i][j]!=10000) ja=max(f[i][j],ja); cout<<(ja+1)/2; return 0; }
转载请注明原文地址: https://www.6miu.com/read-64696.html

最新回复(0)