-->Cheese

原文是日语,这里就写中文了

Descriptions:

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

input

第一行三个整数H(1 <= H <= 1000)、W(1 <= W <=1000)、N(1 <= N <= 9),之后H行W列为地图, “.“为空地, ”X“为障碍物,”S“为老鼠洞,N表示有N个生产奶酪的工厂,硬度为1-N。

output 

吃完所有工厂的最小步数

Sample Input 1

  1. 3 3 1
  2. S..
  3. ...
  4. ..1

Sample Output 1

  1. 4

Sample Input 2

  1. 4 5 2
  2. .X..1
  3. ....X
  4. .XX.S
  5. .2.X.

Sample Output 2

  1. 12

Sample Input 3

  1. 10 10 9
  2. .X...X.S.X
  3. 6..5X..X1X
  4. ...XXXX..X
  5. X..9X...X.
  6. 8.X2X..X3X
  7. ...XX.X4..
  8. XX....7X..
  9. X..X..XX..
  10. X...X.XX..
  11. ..X.......

Sample Output 3

  1. 91

题目链接:

https://vjudge.net/problem/Aizu-0558

题目比较复杂

简单来说就是让你求从起点‘S’到‘1’,‘1’到‘2’,‘2’到‘3’...‘n-1’到‘n’的最短距离,这样大家应该都会了吧,我这里写的bfs,具体可以看注释,dfs应该也行......

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. #include <sstream>
  15. #define mod 1000000007
  16. #define eps 1e-6
  17. #define ll long long
  18. #define INF 0x3f3f3f3f
  19. #define MEM(x,y) memset(x,y,sizeof(x))
  20. #define Maxn 1005
  21. using namespace std;
  22. struct node
  23. {
  24. int x,y,step;//在(x,y)的步数
  25. };
  26. node now,net;
  27. node a[Maxn*Maxn];//工厂
  28. char mp[Maxn][Maxn];//地图
  29. int vis[Maxn][Maxn];//标记是否走过
  30. int dt[][] = {{,},{,},{,-},{-,}};//4个方向
  31. int h,w,n;
  32. int total;
  33. int bfs(node s,node e)//从s走到e
  34. {
  35. MEM(vis,);//没次都要初始化为0
  36. queue<node>q;
  37. now.x=s.x,now.y=s.y,now.step=s.step;//初始化队列
  38. vis[now.x][now.y]=;
  39. q.push(now);
  40. while(!q.empty())
  41. {
  42. now=q.front();
  43. q.pop();
  44. if(now.x==e.x&&now.y==e.y)//找到目的地
  45. return now.step;
  46. for(int i=; i<; i++)//四个方向走法
  47. {
  48. net.x=now.x+dt[i][];
  49. net.y=now.y+dt[i][];
  50. net.step=now.step+;
  51. if(net.x>=&&net.x<h&&net.y>=&&net.y<w&&!vis[net.x][net.y]&&mp[net.x][net.y]!='X')//满足条件
  52. {
  53. vis[net.x][net.y]=;//标记走过
  54. q.push(net);
  55. }
  56. }
  57. }
  58. }
  59. int main()
  60. {
  61. cin>>h>>w>>n;
  62. for(int i=; i<h; i++)
  63. for(int j=; j<w; j++)
  64. {
  65. cin>>mp[i][j];
  66. if(mp[i][j]=='S')//把起点设为0
  67. mp[i][j]='';
  68. for(int k=; k<=n; k++)//标记工厂,分别储存
  69. {
  70. if(mp[i][j]-''==k)
  71. {
  72. a[k].x=i;
  73. a[k].y=j;
  74. a[k].step=;
  75. }
  76. }
  77. }
  78. total=;
  79. for(int i=; i<n; i++)//开始搜索 增加步数
  80. total+=bfs(a[i],a[i+]);//a[0]到a[1] a[1]到a[2]......
  81. cout<<total<<endl;
  82.  
  83. }

【Aizu - 0558】Cheese(bfs)的更多相关文章

  1. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  2. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  3. 【HDU - 3533】Escape(bfs)

    Escape  Descriptions: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y问这个人能不能安全到 ...

  4. 【Aizu - 0525】Osenbei (dfs)

    -->Osenbei 直接写中文了 Descriptions: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以 ...

  5. 【UOJ#311】【UNR #2】积劳成疾(动态规划)

    [UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...

  6. 【UOJ#246】套路(动态规划)

    [UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...

  7. 【LOJ#6074】子序列(动态规划)

    [LOJ#6074]子序列(动态规划) 题面 LOJ 题解 考虑一个暴力\(dp\). 设\(f[i][c]\)表示当前在第\(i\)位,并且以\(c\)结尾的子序列个数. 那么假设当前位为\(a\) ...

  8. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  9. 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

随机推荐

  1. 多组件共享-vuex —— 使用vuex 报错 actions should be function or object with ”handler“

    vuex分模块使用时出现的问题,单文件暂时没有用到 原因是在action 文件中没有任何定义(即:文件为空)或则 action 没有任何方法返回,将action在模块引用时去掉即可 转自:https: ...

  2. 51nod 1172 Partial Sums V2

    题目 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作 ...

  3. js深度克隆

    function highClone(oldObj){ var cloneObj; if(oldObj.constructor==Object || oldObj.constructor==Array ...

  4. codevs 3022 西天收费站 x

                         题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入 ...

  5. Vmware CentOS 7自适应屏幕分辨率

  6. permutation 2(递推 + 思维)

    permutation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  7. 20.Python类型转换,Python数据类型转换函数大全

    虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换. 比如说,我们想通过使用 print() 函数输出信 ...

  8. MySQL_(Java)使用JDBC创建用户名和密码校验查询方法

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL数据库中的数据,数据库名garysql,表名garytb,数据库中存在的用户表 通过JDBC对MySQL中的数据用户名和密码 ...

  9. BZOJ1123 BLO

    割点的好题. 联通图,难度降低.首先对于一个点,如果他不是割点,那它的贡献是2*(n-1),就是任何一个其他节点都少了正反两个数对,这个看样例可以看出来. 如果它是一个割点,去掉他以后会出现若干个联通 ...

  10. LVS分析

    概述 LVS是章文嵩博士十几年前的开源项目,已经被何如linux kernel 目录十几年了,可以说是国内最成功的kernle 开源项目, 在10多年后的今天,因为互联网的高速发展LVS得到了极大的应 ...