AOJ0558 Chese(bfs)

aoj的网页打不开,发现一个Virtual Judge(https://vjudge.net/),太强了,必须吹爆,通过这个还是可以做aoj上的题的

题目链接(原题是日文)

問題

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

入出力例

输入:第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞,N表示有N个生产奶酪的工厂,硬度为1-N。

入力例 1

3 3 1
S..
...
..1

出力例 1

4

入力例 2

4 5 2
.X..1
....X
.XX.S
.2.X.

出力例 2

12

入力例 3

10 10 9
.X...X.S.X
6..5X..X1X
...XXXX..X
X..9X...X.
8.X2X..X3X
...XX.X4..
XX....7X..
X..X..XX..
X...X.XX..
..X.......

出力例 3

91

 

由“老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪”可知老鼠一定是从起点开始首先吃硬度为1的奶酪,再吃硬度为2的奶酪,直至硬度为N的奶酪,因此只要求出硬度为i-1与i的奶酪间的最小时间,累加起来即可。将起点S处设为硬度为0的奶酪方便表达。

用ch[i]保存硬度为i的奶酪。

求硬度为i-1与i的奶酪间的最小时间时,需将isvisit数组重新初始化为0,ch数组里面的time也要初始化为0。

输出结果时没加换行判了我“Presentation Error”,最后加了个换行才AC,一脸懵逼╥﹏╥

AC代码:

#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
struct node
{
	int x,y,time;
	node(int a=0,int b=0,int t=0)
	{
		x=a;y=b;time=t;
	}
}ch[10];
char map[1010][1010];
int H,W,N;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//方向数组 
int isvisit[1010][1010];
int bfs(node a,node b)//从a到b的最小时长 
{
	memset(isvisit,0,sizeof(isvisit));
	for(int i=0;i<=N;i++) ch[i].time=0;
	queue<node> que;
	que.push(a);
	while(!que.empty())
	{
		node q=que.front();que.pop();
		if(q.x==b.x&&q.y==b.y) return q.time;//吃到b啦
		
		for(int i=0;i<4;i++)
		{
			int xx=q.x+dx[i],yy=q.y+dy[i];
			if(xx<1||xx>H||yy<1||yy>W) continue;//越界 
			if(isvisit[xx][yy]) continue;//访问过 
			if(map[xx][yy]=='X') continue;//障碍物 
			isvisit[xx][yy]=1;
			que.push(node(xx,yy,q.time+1));
		}
	}
}
int main()
{
	cin>>H>>W>>N;
	for(int i=1;i<=H;i++)
	{
		for(int j=1;j<=W;j++)
		{
			cin>>map[i][j];
			if(map[i][j]=='S') ch[0].x=i,ch[0].y=j;
			else if(map[i][j]-'0'>=1&&map[i][j]-'0'<=N)
			    ch[map[i][j]-'0'].x=i,ch[map[i][j]-'0'].y=j;
		}
	}
	
	int ans=0;
	for(int i=1;i<=N;i++)
	    ans+=bfs(ch[i-1],ch[i]);
	cout<<ans<<endl;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值