AOJ 0558 Cheese (BFS)

题目链接

解析

此题就是bfs的简单应用,N块奶酪相当于N个终点,所以遍历进行N次bfs,再把结果累加起来就好了。

#include <bits/stdc++.h>
using namespace std;
int H,W,N;
char Map[1010][1010];
int Si[10];
int Sj[10];
int ans=0;
typedef pair<int,int> P;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int dis[1010][1010];
int bfs(int i)
{
    memset(dis,-1,sizeof(dis));
    P S=make_pair(Si[i],Sj[i]);
    P E=make_pair(Si[i+1],Sj[i+1]);
    dis[Si[i]][Sj[i]] = 0;
    queue<P> q;
    q.push(S);
    while(q.size())
    {
        P next=q.front();
        q.pop();
        if(next.first==Si[i+1]&&next.second==Sj[i+1])
            break;
        for(int i=0;i<4;i++)
        {
            int nx=next.first+dx[i];
            int ny=next.second+dy[i];
            if(dis[nx][ny]<0&&nx>=1&&nx<=H&&ny>=1&&ny<=W&&Map[nx][ny]=='.')
            {
                q.push(P(nx,ny));
                dis[nx][ny]=dis[next.first][next.second]+1;
            }
        }
    }
    return dis[E.first][E.second];

}
int main()
{
    //需要注意输入的时候 防止回车符读入数据中
    //还需要将'S'和奶酪工厂处的值置为'.'
    scanf("%d%d%d",&H,&W,&N);
    getchar();
    for(int i=1;i<=H;i++)
    {
        for(int j=1;j<=W;j++)
        {
            scanf("%c",&Map[i][j]);
            if(Map[i][j]=='S')
            {
                Si[0]=i;
                Sj[0]=j;
                Map[i][j]='.';   
            }
            else if(isdigit(Map[i][j]))
            {
                Si[Map[i][j]-48]=i;
                Sj[Map[i][j]-48]=j;
                Map[i][j]='.';
            }
        }
        getchar();
    }
    for(int i=0;i<N;i++)
    {
        //cout<<i<<": "<<bfs(i)<<endl;
        ans+=bfs(i);
    }
    printf("%d\n",ans);
    return 0;
}

原创文章 39 获赞 5 访问量 4932

猜你喜欢

转载自blog.csdn.net/q1072118803/article/details/86095556