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