您的位置:首页 > 大数据 > 人工智能

Aizu - 0558 Cheese (bfs)

2015-03-28 18:30 148 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=49879

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

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

输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞, 1-N代表硬度为1-N的奶酪的工厂。(中文翻译参考了http://bbs.byr.cn/#!article/ACM_ICPC/73337?au=Milrivel)

思路:老鼠必须从硬度小的开始吃,这样才能有体力去吃其他硬度大的奶酪。这样就是求老鼠分别到各个点的最短路即可。

#include <iostream>
#include <cstdio>
//#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>

#define CL(arr, val)    memset(arr, val, sizeof(arr))

#define ll long long
#define inf 0x7f7f7f7f
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)

#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define Read()  freopen("a.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);
#define maxn 1000000000
#define N 1010
using namespace std;

int h,w,x;
int dir[4][2]={-1,0,0,1,0,-1,1,0};
typedef pair<int,int> P; //pair表示状态
char maze

;
int d

;
P p;

int bfs(char c)
{
queue<P>que;
for(int i=0;i<h;i++)  //首先把距离初始为无穷大,然后不断更新最小值
for(int j=0;j<w;j++) d[i][j]=maxn;
que.push(p);
d[p.first][p.second]=0;  //起点的距离为0
P p1,p2;
while(que.size())
{
p1=que.front(); que.pop();
if(maze[p1.first][p1.second]==c)
{
p=p1; break;  //找到终点
}
for(int i=0;i<4;i++)
{
p2.first=p1.first+dir[i][0];
p2.second=p1.second+dir[i][1];
if(p2.first>=0&&p2.first<h&&p2.second>=0&&p2.second<w&&maze[p2.first][p2.second]!='X'&&d[p2.first][p2.second]==maxn)
{   //判断是否可以移动以及是否访问过   d[i][j]!=maxn即访问过
que.push(p2);
d[p2.first][p2.second]=d[p1.first][p1.second]+1;
}
}
}
return d[p.first][p.second];
}

int main()
{
//freopen("a.txt","r",stdin);
while(~scanf("%d%d%d",&h,&w,&x))
{
getchar();
int sum=0;
for(int i=0;i<h;i++)
{
scanf("%s",maze[i]);
//printf("%s\n",maze[i]);
for(int j=0;j<w;j++)
{
if(maze[i][j]=='S')
{
p.first=i;
p.second=j;
}
}
}
//printf("%d %d\n",p1.first,p1.second);
for(int i=1;i<=x;i++)  //x个点,x个bfs
{
sum+=bfs('0'+i);
}
printf("%d\n",sum);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: