zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    mysql创建和删除表
    性能测试工具curlloader(linux)
    Linux安装与硬盘分区
    linux那点事儿(上)
    Linux文件传输与mysql数据库安装
    性能测试工具curlloader二测试分析
    菜鸟学自动化测试(六)selenium 命令之文字范本匹配
    git/github初级运用自如
    开源自动化测试框架Tellurium
    菜鸟学自动化测试(五)selenium命令之定位页面元素
  • 原文地址:https://www.cnblogs.com/mzchuan/p/11184148.html
Copyright © 2011-2022 走看看