因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步).

然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数。(至于原题问的为什么是这个,很简单,因为建造的香蒲要最少,所以不会重复建造,不会多建造,所以就是求最短路,至于路径数,因为现在路径长度是简单递增的,所以直接累加就可以了)。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int maxn=30+9;
  6. int dist[maxn][maxn],a[maxn][maxn];
  7. int n,m;
  8. bool d[maxn][maxn][maxn][maxn];
  9. int quex[maxn*maxn],quey[maxn*maxn];
  10. long long ans[maxn][maxn];
  11. bool text[maxn][maxn];
  12. void bfs2(int t,int s)
  13. {
  14. int front=1,end=0;
  15. quex[++end]=t;
  16. quey[end]=s;
  17. memset(dist,50,sizeof(dist));
  18. memset(ans,0,sizeof(ans));
  19. dist[t][s]=0;
  20. ans[t][s]=1;
  21. while(front<=end)
  22. {
  23. int x=quex[front],y=quey[front++];
  24. if(a[x][y]==2) continue;
  25. for(int i=1;i<=n;i++)
  26. for(int j=1;j<=m;j++)
  27. if(d[x][y][i][j])
  28. {
  29. if(dist[i][j]==dist[x][y]+1)
  30. ans[i][j]+=ans[x][y];
  31. else if(dist[i][j]>dist[x][y]+1)
  32. {
  33. dist[i][j]=dist[x][y]+1;
  34. ans[i][j]=ans[x][y];
  35. quex[++end]=i;
  36. quey[end]=j;
  37. }
  38. }
  39. }
  40. }
  41.  
  42. void bfs(int t,int s)
  43. {
  44. memset(text,0,sizeof(text));
  45. int front=1,end=0;
  46. quex[++end]=t;
  47. quey[end]=s;
  48. text[t][s]=1;
  49. while(front<=end)
  50. {
  51. int x=quex[front],y=quey[front++];
  52. for(int i=-1;i<=1;i+=2)
  53. for(int j=-1;j<=1;j+=2)
  54. for(int k=1;k<=2;k++)
  55. {
  56. int tmp=1;
  57. if(k==1) tmp=2;
  58. int tox=x+i*k,toy=j*tmp+y;
  59. if(tox>=1&&tox<=n&&toy>=1&&toy<=m)
  60. if(!text[tox][toy])
  61. {
  62. text[tox][toy]=1;
  63. if(a[tox][toy]==1)
  64. {
  65. quex[++end]=tox;
  66. quey[end]=toy;
  67. }
  68. else
  69. {
  70. d[t][s][tox][toy]=1;
  71. }
  72. }
  73. }
  74. }
  75. }
  76.  
  77. int main()
  78. {
  79. while(scanf("%d %d",&n,&m)!=EOF)
  80. {
  81. int t,s,tox,toy;
  82. for(int i=1;i<=n;i++)
  83. for(int j=1;j<=m;j++)
  84. {
  85. scanf("%d",&a[i][j]);
  86. if(a[i][j]==3)
  87. {
  88. t=i;
  89. s=j;
  90. }
  91. else if(a[i][j]==4)
  92. {
  93. tox=i;
  94. toy=j;
  95. }
  96. }
  97. memset(d,0,sizeof(d));
  98. for(int i=1;i<=n;i++)
  99. for(int j=1;j<=m;j++)
  100. bfs(i,j);
  101. bfs2(t,s);
  102. if(dist[tox][toy]>1e3)
  103. {
  104. printf("-1\n");
  105. }
  106. else
  107. {
  108. printf("%d\n%lld\n",dist[tox][toy]-1,ans[tox][toy]);
  109. }
  110. }
  111. return 0;
  112. }

poj 3271 Lilypad Pond bfs的更多相关文章

  1. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

    题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 390  Solved: 109[ ...

  2. 1632: [Usaco2007 Feb]Lilypad Pond

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 404  Solved: 118[Sub ...

  3. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  4. bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond

    P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽 ...

  5. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  6. 最短路【洛谷P1606】 [USACO07FEB]荷叶塘Lilypad Pond

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令 ...

  7. P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  8. 【BZOJ】1632: [Usaco2007 Feb]Lilypad Pond(bfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1632 我简直是个sb... ... bfs都不会写.. 算方案还用2个bfs! 都不会整合到一个! ...

  9. bzoj 1632: [Usaco2007 Feb]Lilypad Pond【bfs】

    直接bfs,在过程中更新方案数即可 #include<iostream> #include<cstdio> #include<queue> using namesp ...

随机推荐

  1. 第十二章作业 MemoryBugs-master项目优化笔记

    作业要求: 下载bug项目:https://github.com/lzyzsd/MemoryBugs,请注意配合使用MemoryMonitor, AllocationTracker以及HeapDump ...

  2. Python sys.path.append

    python sys.path.append 对于模块和自己写的程序不在同一个目录下,可以把模块的路径通过sys.path.append(路径)添加到程序中. 在程序开头加上: import syss ...

  3. cocos2d-x 实现粒子飞行特效

    效果图 说明 实现效果: 按下鼠标并且移动, 所到之处产生光圈 光圈会以窗口中心为终点, 并且会偏移自身角度对准终点, 然后持续飞行, 直到终点. 附件 下载源码, 请猛击这里!

  4. connect network is unreachable 解决办法

    详细教程见:http://blog.csdn.net/liukun321/article/details/6662950 1.虚拟机中的centos系统要连接外网,我们需要使用桥接网络 2.正常配置e ...

  5. 解决css3遮罩层挡住下面元素事件的方法

    比如大家常看到的鼠标移入图片中,会有一个挡住图片的黑色半透明遮罩层,上面还有文字介绍,这时候就会遇到该层遮挡住下面图片的跳转链接事件,这时候怎么办呢?有个简单的css3属性可以快速解决该问题:poin ...

  6. jQuery中$.get()、$.post()和$.ajax()

    jQuery.get()方法: $.get(url,data,success(response,status,xhr),dataType) 该函数是简写的 Ajax 函数,等价于: $.ajax({ ...

  7. mongoDB之用户及权限设置

    之前用MongoDB没有设置用户和权限,一直都是本机应用程序连接MongoDB.在服务器上部署后对外没有开数据库连接端口,本机应用程序连接再开放应用程序端口供外部访问. 我部署的环境是ubuntu 1 ...

  8. HTML&CSS基础学习笔记1.30-颜色的表达

    颜色的表述 在网页中的颜色设置是非常重要,CSS的属性有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 ...

  9. 省队集训day6 B

    一道AC自动机题···· 一定要把一个节点没有的儿子接到它fai的儿子,否则会卡到n^2的······· #include<cstdio> #include<iostream> ...

  10. Unity3d在安卓android的更新(APK覆盖)

    其实这并没什么技术难点,也不是完美的热更新方案,只能说是退而求其次的一个方法. 起因主要是因为公司几个U3D项目在立项之初都没有能做好热更新的规化,导致现在要去做U3D的热更新非常难,并且项目已处于中 ...