Cheese Aizu - 0558-bfs

题意:

在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。 

老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。

思路:bfs,从小到大吃奶酪。





AC代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
//bfs用queue


using namespace std;
int h,l,k;
char g[1005][1005];
int v[1005][1005];
int dy[5]={1,0,-1,0};
int dx[5]={0,1,0,-1};
//int ans;
struct mouse
{
    int sx,sy,time;
     mouse(int a=0,int b=0,int c=0):sx(a),sy(b),time(c){}
};






bool brand(int x,int y)//判断是越界或墙
{
    if(x<0||x>=h||y<0||y>=l||g[x][y]=='X')
        return true;
    else
        return false;
}
mouse bfs(int x,int y,char c)
{
    memset(v,0,sizeof(v));
     queue<mouse> q;
    mouse p(x,y,0);
    q.push(p);
    v[x][y]=1;
    while(!q.empty())
{
       mouse m=q.front();
        q.pop();


      if(g[m.sx][m.sy]==c)
            return m;
         for(int i=0;i<4;i++)
    {


        int nx=m.sx+dx[i];
        int ny=m.sy+dy[i];




        if(brand(nx,ny))//如果越界
        {
            continue;
        }


     mouse t(nx,ny,m.time+1);
        if(!v[nx][ny])
        {
            v[nx][ny]=1;


            q.push(t);
        }


    }


}




}


int main()
{
    while(scanf("%d%d%d",&h,&l,&k)!=EOF)
{






    int xx=0,yy=0;


        for(int i=0;i<h;i++)
       //  for(int j=0;j<l;j++)
        {
            scanf("%s",g[i]);




        }


       for(int i=0;i<h;i++)
            for(int j=0;j<l;++j)
            {
                if(g[i][j]=='S')
                {
                    xx=i,yy=j;
                    g[i][j]='0';
                }
            }


//    for(int i=0;i<h;++i)
// {
// scanf("%s",g[i]);
// for(int j=0;j<l;++j)
// {
// if(g[i][j]=='S')
// {
// xx=i;yy=j;
//
// g[i][j]='0'; //第0个起点
// }
// }
// }


          int ans=0;
        for(int i=0;i<k;i++)
        {
            mouse mm=bfs(xx,yy,g[xx][yy]+1);//体力值初始为1
                ans+=mm.time;
                xx=mm.sx,yy=mm.sy;


        }
        cout<<ans<<endl;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值