Cheese

チーズ ()

問題

今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に区画整理されていて,各区画は巣,チーズ工場,障害物,空き地のいずれかである.ねずみは巣から出発して全てのチーズ工場を訪れチーズを 1 個ずつ食べる.

この町には,N 個のチーズ工場があり,どの工場も1種類のチーズだけを生産している.チーズの硬さは工場によって異なっており,硬さ 1 から N までのチーズを生産するチーズ工場がちょうど 1 つずつある.

ねずみの最初の体力は 1 であり,チーズを 1 個食べるごとに体力が 1 増える.ただし,ねずみは自分の体力よりも硬いチーズを食べることはできない.

ねずみは,東西南北に隣り合う区画に 1 分で移動することができるが,障害物の区画には入ることができない.チーズ工場をチーズを食べずに通り過ぎることもできる.すべてのチーズを食べ終えるまでにかかる最短時間を求めるプログラムを書け.ただし,ねずみがチーズを食べるのにかかる時間は無視できる.

入力

入力は H+1 行ある.1 行目には 3 つの整数 H,W,N (1 ≤ H ≤ 1000,1 ≤ W ≤ 1000,1 ≤ N ≤ 9) がこの順に空白で区切られて書かれている.2 行目から H+1 行目までの各行には,'S','1', '2', ..., '9','X','.' からなる W 文字の文字列が書かれており,各々が各区画の状態を表している.北から i 番目,西から j 番目の区画を (i,j) と記述することにすると (1 ≤ i ≤ H, 1 ≤ j ≤ W),第 i+1 行目の j 番目の文字は,区画 (i,j) が巣である場合は 'S' となり,障害物である場合は 'X' となり,空き地である場合は '.' となり,硬さ 1, 2, ..., 9 のチーズを生産する工場である場合はそれぞれ '1', '2', ..., '9' となる.入力には巣と硬さ 1, 2, ..., N のチーズを生産する工場がそれぞれ 1 つずつある.他のマスは障害物または空き地であることが保証されている.ねずみは全てのチーズを食べられることが保証されている.

出力

すべてのチーズを食べ終えるまでにかかる最短時間(分)を表す整数を 1 行で出力せよ.

入出力例

入力例 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

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

 

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

 

思路:

因为给出的数字是连续的,初始的值是1,只能吃比自己体力小的奶酪,到达奶酪时可以选择吃或者不吃,所以每个位置可能经过多次,不能简单的标记,这样考虑:因为题目限制,那么必定吃的数字的顺序是1 2 3 ...依次递增,那么就把这个总的任务分解成从 0(开始)到1,从1到2...分别求最短路径的情况,单独处理每一段,最后累加所有的最短时间,肯定是最优解了。

 1 #include <cstdio>
 2 #include <fstream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <deque>
 6 #include <vector>
 7 #include <queue>
 8 #include <string>
 9 #include <cstring>
10 #include <map>
11 #include <stack>
12 #include <set>
13 #include <sstream>
14 #include <iostream>
15 #define mod 1000000007
16 #define eps 1e-6
17 #define ll long long
18 #define INF 0x3f3f3f3f
19 using namespace std;
20 
21 int h,w,n;
22 int qx,qy;
23 int bj[1005][1005];
24 int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1};
25 string mg[1005];
26 struct node
27 {
28     int x,y;
29     int l;
30 };
31 
32 int bfs(int i)
33 {
34     node no;
35     no.x=qx;
36     no.y=qy;
37     no.l=0;
38     queue<node> qu;
39     qu.push(no);
40     memset(bj,0,sizeof(bj));
41     bj[qx][qy]=1;
42     mg[qx][qy]='.';
43     while(!qu.empty())
44     {
45         for(int k=0;k<4;k++)
46         {
47             no=qu.front();
48             if(mg[no.x][no.y]==i+48)
49             {
50                 qx=no.x;
51                 qy=no.y;
52                 return no.l;
53             }
54             int x=no.x+fx[k];
55             int y=no.y+fy[k];
56             if(x>=0&&x<h&&y>=0&&y<w&&bj[x][y]==0&&mg[x][y]!='X')
57             {
58                 no.l++;
59                 no.x=x;
60                 no.y=y;
61                 bj[no.x][no.y]=1;
62                 qu.push(no);
63             }
64         }
65         qu.pop();
66     }
67 }
68 int main()
69 {
70     scanf("%d %d %d",&h,&w,&n);
71     for(int i=0;i<h;i++)
72     {
73         cin>>mg[i];
74         for(int j=0;j<w;j++)
75         {
76             if(mg[i][j]=='S')
77             {
78                 qx=i;
79                 qy=j;
80             }
81         }
82     }
83     int ans=0;
84     for(int i=1;i<=n;i++)
85     {
86         ans+=bfs(i);
87     }
88     printf("%d
",ans);
89 }
原文地址:https://www.cnblogs.com/mzchuan/p/11184148.html