您的位置:首页 > 其它

ACM 搜索 hdu 2612 Find a way

2016-05-28 10:20 323 查看
[align=left]Problem Description[/align]
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.

Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.

Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.

 

[align=left]Input[/align]
The input contains multiple test cases.

Each test case include, first two integers n, m. (2<=n,m<=200).

Next n lines, each line included m character.

‘Y’ express yifenfei initial position.

‘M’    express Merceki initial position.

‘#’ forbid road;

‘.’ Road.

‘@’ KCF

 

[align=left]Output[/align]
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
 

[align=left]Sample Input[/align]

4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#

 

[align=left]Sample Output[/align]

66
88
66

他不只有一个KFC!这意味着我们需要求出所有的来,找最小值。那样我们可以设立一个数组,记录人到x,y点处所用的时间,之后这要这个点是KFC,我们就更新min!!!!
除此之外就是一个很经典的BFS了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node
{
    int x;
    int y;
    int count;
};
int n,m;
char ditu[1005][1005];
bool visit[1005][1005];
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int manx,many,womanx,womany;
int mantime[1005][1005],womentime[1005][1005];
deque<node>Q;
void BFS(node p,int mantime[][1005])
{
    int i;
    node q;
    memset(visit,0,sizeof(visit));
    memset(mantime,0,sizeof(mantime));
    Q.push_front(p);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop_front();
        for(i=0;i<4;i++)
        {
            q.x=p.x+to[i][0];
            q.y=p.y+to[i][1];
            q.count=p.count+1;
            if (q.x>=0&&q.y>=0&&q.x<m&&q.y<n&&ditu[q.x][q.y]!='#'&&!visit[q.x][q.y])
             {
                 visit[q.x][q.y]=1;
                 mantime[q.x][q.y]=q.count;
                 Q.push_back(q);
             }
        }
    }
}
int main()
{
    int i,j,min;
    node p;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
           {
               cin>>ditu[i][j];
               if(ditu[i][j]=='Y')
                 {
                  manx=i;
                  many=j;
                 }
                else if(ditu[i][j]=='M')
                {
                    womanx=i;
                    womany=j;
                }
           }
    }
    min=9999999;
    p.x=manx;
    p.y=many;
    p.count=0;
    BFS(p,mantime);
    p.x=womanx;
    p.y=womany;
    p.count=0;
    BFS(p,womentime);
     for (i=0;i<m;i++)
            for (j=0;j<n;j++)
                if (ditu[i][j]=='@')
                    if (mantime[i][j]!=0&&womentime[i][j]!=0)
                        if(mantime[i][j]+womentime[i][j]<min)/*比较求距离的最小值*/
                            min = mantime[i][j]+womentime[i][j];

        printf("%d/n",min*11);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: