题意:
在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;
}
}