码迷,mamicode.com
首页 > 其他好文 > 详细

usaco Overfencing

时间:2015-09-06 12:55:22      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

 题意是给一个二维的迷宫,求任意一个点以最优方案走到出口的步数。求这些点中里出口最远的一个点的步数。

迷宫有两个出口。

 做法是从两个出口各做一遍宽度优先搜索,然后就得到了所有点离当前门口最近的距离。在step数组中记录下最短距离,然后两边宽搜取最小值。

然后遍历step数组,输出最大的一个就是答案。

/*
ID: modengd1
PROG: maze1
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
char input[210][90];
int step[210][90];
bool vis[210][90];
int W,H;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct node
{
    int x,y;
    int T;
    node(int xx,int yy,int tt)
    {
        x=xx;y=yy;T=tt;
    }
    node(){}
};
void BFS(int xx,int yy)
{
    memset(vis,false,sizeof(vis));
    queue<node> Q;
    node now=node(xx,yy,1);
    step[xx][yy]=1;
    vis[xx][yy]=true;
    Q.push(now);
    while(!Q.empty())
    {
        now=Q.front();
        Q.pop();
        node next;
        for(int i=0;i<4;i++)
        {
            next=node(now.x+dx[i]+dx[i],now.y+dy[i]+dy[i],now.T+1);
            if(next.x>=2*H+1||next.x<0||next.y>=2*W+1||next.y<0)
                continue;
            if(input[next.x-dx[i]][next.y-dy[i]]!=‘ ‘)
                continue;
            if(vis[next.x][next.y])
                continue;
            vis[next.x][next.y]=true;
            if(step[next.x][next.y]>next.T)
                step[next.x][next.y]=next.T;
            Q.push(next);
        }
    }
}
int main()
{
    freopen("maze1.in","r",stdin);
    freopen("maze1.out","w",stdout);
    memset(step,0x7f,sizeof(step));
    int x1,y1,x2,y2;
    scanf("%d%d",&W,&H);
    getchar();
    for(int i=0;i<2*H+1;i++)
    {
        for(int j=0;j<2*W+1;j++)
        {
            scanf("%c",&input[i][j]);
        }
        getchar();
    }
    for(int i=0;i<2*W+1;i++)
    {
        if(input[0][i]==‘ ‘)
            BFS(1,i);
        if(input[2*H][i]==‘ ‘)
            BFS(2*H-1,i);
    }
    for(int j=0;j<2*H+1;j++)
    {
        if(input[j][0]==‘ ‘)
            BFS(j,1);
        if(input[j][2*W]==‘ ‘)
            BFS(j,2*W-1);
    }
    int ans=0;
    for(int i=1;i<2*H;i+=2)
    {
        for(int j=1;j<2*W;j+=2)
            ans=max(ans,step[i][j]);
    }
    cout<<ans<<endl;
    return 0;
}

  

usaco Overfencing

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4785047.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!