Cheese
問題
在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
問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。
本来用dfs做的,不过一直超时。。难受
应该用bfs做的
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<bitset>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int ,int> P;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e3+7;
char maze[MAXN][MAXN];
int d[MAXN][MAXN];
int gx[22];
int gy[22];
bool vis[MAXN][MAXN];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int minStep, n, m, k;
int sx,sy;
bool check(int x, int y){
return x>=0 && y>=0 && x<n && y<m && maze[x][y]!='X'&&d[x][y]==INF;
}
int bfs(int sx,int sy, int ex, int ey){
memset(d,0x3f,sizeof(d));
queue<P> que;
que.push(P(sx,sy));
d[sx][sy] = 0;
while(!que.empty()){
P p = que.front(); que.pop();
if(p.first==ex&&p.second==ey)
break;
for(int i=0;i<4;++i){
int nx = p.first + dx[i];
int ny = p.second + dy[i];
if(check(nx,ny)){
que.push(P(nx,ny));
d[nx][ny] = d[p.first][p.second] + 1;
}
}
}
return d[ex][ey];
}
int main(){
// freopen("../in.txt","r",stdin);
// freopen("../out.txt","w",stdout);
while(~scanf("%d %d %d",&n,&m,&k)){
for(int i=0;i<n;++i)
scanf("%s", maze[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(maze[i][j]=='S'){
gx[0] = i;
gy[0] = j;
}
else if(maze[i][j]>='0' && maze[i][j]<='9'){
int t = maze[i][j] - '0';
gx[t] = i;
gy[t] = j;
}
int ans = 0;
for(int i=1;i<=k;++i)
ans += bfs(gx[i-1], gy[i-1], gx[i], gy[i]);
printf("%d\n",ans);
}
return 0;
}