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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章