aoj0558
一、题意: 在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的更多相关文章
- 《挑战程序设计竞赛》2.1 广度优先搜索 AOJ0558 POJ3669 AOJ0121
AOJ0558 原文链接: AOJ0558 题意: 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪.有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪.老鼠有一个体力值,初始时为1,每 ...
- 挑战程序2.1.5 穷竭搜索>>宽度优先搜索
先对比一下DFS和BFS 深度优先搜索DFS 宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...
随机推荐
- jq遍历table表demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- redis内存优化方法
先来认识2个redis配置参数 hash-max-ziplist-entries : hash内部编码压缩列表的最大值,默认512 hash-max-zipmap-value : hash内部编码压缩 ...
- javascript总结3:javaScript的 Math 对象
Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). Math 常用的方法 var n1=1234; v ...
- Java Java7处理异常新特性
- 面试题:测试给定的list,使用for,foreach,iterator删除元素的不同表现
上代码: 1. 使用增强for循环(foreach) package com.xxx; import java.util.ArrayList; import java.util.List; /** * ...
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- 通过vb.net 和NPOI实现对excel的读操作
通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...
- sql server 简单语句整合
1.去重distinct , group by select distinct userid,username from 表名 select userid,username from 表名 group ...
- C#上位机中ZedGraph控件的使用
上位机程序控制PLC模拟量通道输出周期性正弦波信号,并采集所造成改变的模拟量输入信号,并绘制数据变化曲线. 界面如图: 最后测试效果如图: 代码: using System; using System ...
- 分享我访问google的方法
对于程序员来说,有很多技术问题还是通过互联网搜索来解决的.所以百度.google对于我们是多少的重要.但是GOOGLE现在无法访问了.怎么办呢.以下是我访问google的方法. 首先自己制作了一个简单 ...