HDU2612---Find a way

题意:

找到Y点和M点到@点的距离之和最小。


解题思路:

从Y点进行一次bfs,求取所有点到Y点的距离,存储在dis[0][i][j]中;

从M点进行一次bfs,求取所有点到M点的距离,存储在dis[1][i][j]中;

最后,遍历整个图,求取所有@点的dis[0]+dis[1]的最小值。


反思:

这个题目思路很简单,但是我一直在一个地方跪了。

在初始化dis数组的时候,我开始用的是memset但是总是wa,后来改成了for循环进行初始化就ac了。

百思不得其解,希望各位小伙伴不吝赐教。


ac源代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int INF=9999999;
const int maxn=210;

int map[maxn][maxn];    //-1,0,1;
int dis[2][maxn][maxn];
struct node
{
    int x,y;
}que[maxn*maxn];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int sx,sy,tx,ty;
int n,m;
char ch[maxn];

void bfs(int s,int sx,int sy)   //先进来的点肯定是时间最早的点
{
    int f=0,r=1;
    node now;
    now.x=sx,now.y=sy;
    que[f]=now;
    dis[s][sx][sy]=0;
    while(f<r)
    {
        int x=que[f].x,y=que[f++].y;
        for(int i=0;i<4;i++)
        {
            int xx=x+dir[i][0],yy=y+dir[i][1];
            if(map[xx][yy]!=-1 && dis[s][xx][yy]>dis[s][x][y]+1)
            {
                now.x=xx,now.y=yy;
                dis[s][xx][yy]=dis[s][x][y]+1;
                que[r++]=now;
            }
        }
    }
    return;
}

void solve()
{
    int ans=INF;
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++)
            dis[0][i][j]=dis[1][i][j]=INF;
    bfs(0,sx,sy);
    bfs(1,tx,ty);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(map[i][j]==1)
            {
                ans=min(ans,dis[0][i][j]+dis[1][i][j]);
            }
        }
    }
    printf("%d\n",ans*11);
    return;
}
int main()
{
//    freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m)==2)
    {
        memset(map,-1,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            scanf("%s",ch);
            for(int j=0;j<m;j++)
            {
                if(ch[j]!='#')  map[i][j+1]=0;
                if(ch[j]=='Y')
                {
                    sx=i,sy=j+1;
                }
                if(ch[j]=='M')
                {
                    tx=i,ty=j+1;
                }
                if(ch[j]=='@')  map[i][j+1]=1;
            }
        }
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值