一、题意: 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。

二、思路:从0到n,做n次bfs,求出各个最短路径后相加。这里需要注意一下几点:1、没做一次bfs之前距离矩阵要初始化  2、可以在输入时就记录下起始位置和各个奶酪工厂的坐标,也可以在做bfs的过程中通过数值进行判断,都可以,只是提前记录下来写出来的代码思路会更清晰一点,所付出的就是增加一定的空间。

三、代码:

#include"iostream"
#include"stdio.h"
#include"queue"
using namespace std; const int MAXN=1005;
const int INF=100000000;
typedef pair<int,int> P; char maze[MAXN][MAXN];
int dist[MAXN][MAXN];
P factory[15]; int h,w,n; void DistOrigin()
{
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
dist[i][j]=INF;
} bool Judge(int x,int y)
{
if(x>=0&&x<h&&y>=0&&y<w&&maze[x][y]!='X'&&dist[x][y]==INF)
return true;
return false;
} int Bfs(P pS,P pE)
{
queue<P> que;
DistOrigin();
dist[pS.first][pS.second]=0;
que.push(pS); while(que.size())
{
P p=que.front();
que.pop();
if(p==pE) break;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(Judge(nx,ny))
{
dist[nx][ny]=dist[p.first][p.second]+1;
que.push(P(nx,ny));
}
}
}
return dist[pE.first][pE.second];
} int main()
{
while(scanf("%d%d%d",&h,&w,&n)==3)
{
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
cin>>maze[i][j];
char tmp=maze[i][j];
if(tmp!='.'&&tmp!='X'){
if(tmp=='S')
{
factory[0]=P(i,j);
}
else
{
factory[tmp-'0']=P(i,j);
}
}
}
}
int sum=0;
for(int i=0;i<n;i++)
{ int time=Bfs(factory[i],factory[i+1]);
if(time!=INF)
sum+=time;
else
break;
}
cout<<sum<<endl;
}
return 0;
}

  

  

aoj0558的更多相关文章

  1. 《挑战程序设计竞赛》2.1 广度优先搜索 AOJ0558 POJ3669 AOJ0121

    AOJ0558 原文链接: AOJ0558 题意: 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪.有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪.老鼠有一个体力值,初始时为1,每 ...

  2. 挑战程序2.1.5 穷竭搜索>>宽度优先搜索

    先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...

随机推荐

  1. Luogu 3265 [JLOI2015]装备购买

    BZOJ 4004 把所有不能相互表示出来的向量都买下,一定能得到最大能买的方案数. 求解线性无关向量可以高斯消元,最后没有变成$0$向量的就是基底. 本题还要求代价最小怎么办?我们只要先把所有向量按 ...

  2. xml 操作(动态添加 property属性 其他节点同理)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 第十一课,ROS与传感器

    1.Kinect 1)安装 sudo apt-get install ros-indigo-openni-camera sudo apt-get install ros-indigo-openni-l ...

  4. 9.python 系统批量运维管理器之Fabric模块

    前面介绍了paramiko,pexpect模块,今天来说比较适合大型应用自动化部署的模块,或者执行系统命令的模块Fabric. Fabric 是一个 Python 的库,同时它也是一个命令行工具.它提 ...

  5. zend studio永久使用的方法

    安装时选择试用版,以后每天的剩余天数会减少,找到c盘->用户->administrator删除三个文件(.zend,.zend studio,.zs)即可,.zs往往是隐藏的,这时需要选择 ...

  6. h5存储的优点

    1.解决4k大小问题2.解决请求头常带存储信息的问题3.解决关系型存储问题4.可以跨浏览器

  7. Git教程--廖雪峰

    Git简介 1.Git是目前世界上最先进的分布式版本控制系统(没有之一) 2.集中式和分布式版本控制系统有什么区别呢?      区别在于历史版本维护的位置:Git本地仓库包含代码库还有历史库,在本地 ...

  8. python2.7响应数据中unicode转中文

    print ("响应结果:%s" % r.content.decode('unicode_escape')) 一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u75 ...

  9. Delphi xe7 up1 调用android振动功能

    Delphi xe7 up1 调用android振动功能 振动用到以下4个单元: Androidapi.JNI.App,Androidapi.JNIBridge,Androidapi.JNI.Os,A ...

  10. mac 地址查询

    mac 地址由 6个字节(48bit)组成.前3个字节是厂商代码.输入厂商名称可查询相应的代码. http://standards.ieee.org/develop/regauth/oui/publi ...