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