N*M矩阵。从F出发点。走完全部Y点。每个人格开支1电源点,去G点,电池充满,D无法访问。最小的开始问什么时候满负荷可以去完全部Y。Y和G总共高达15一

第一BFS所有的F。Y。G之间的最短距离。

然后一半的首发大。对于每次充电。不喜欢缩进DP推断是否可行

  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "queue"
  4. using namespace std;
  5.  
  6. int inf=0x3f3f3f3f;
  7. int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
  8. struct node
  9. {
  10. int x,y,step;
  11. };
  12. struct Mark
  13. {
  14. int x,y;
  15. }mark[21];
  16.  
  17. char map[21][21];
  18. int step[21][21],b[21],dp[70010][21],dis[21][21];
  19. int cnt,aim,start,n,m;
  20.  
  21. int Min(int a,int b)
  22. {
  23. if (a<b) return a;else return b;
  24. }
  25. void bfs(int x,int y)
  26. {
  27. queue<node>q;
  28. node cur,next;
  29. int i;
  30.  
  31. memset(step,inf,sizeof(step));
  32. step[x][y]=0;
  33. cur.x=x;
  34. cur.y=y;
  35. cur.step=0;
  36. q.push(cur);
  37. while (!q.empty())
  38. {
  39. cur=q.front();
  40. q.pop();
  41. for (i=0;i<4;i++)
  42. {
  43. next.x=cur.x+dir[i][0];
  44. next.y=cur.y+dir[i][1];
  45. if (next.x<0 || next.x>=n || next.y<0 || next.y>=m) continue;
  46. if (map[next.x][next.y]=='D') continue;
  47. if (step[next.x][next.y]!=inf) continue;
  48.  
  49. next.step=cur.step+1;
  50. step[next.x][next.y]=next.step;
  51. q.push(next);
  52. }
  53. }
  54. }
  55.  
  56. int DP(int key)
  57. {
  58. int i,j,k;
  59. memset(dp,inf,sizeof(dp));
  60.  
  61. dp[b[start]][start]=0;
  62.  
  63. for (i=0;i<b[cnt];i++)
  64. for (j=0;j<cnt;j++)
  65. if ((b[j]&i)==b[j] && dp[i][j]!=inf)
  66. {
  67. for (k=0;k<cnt;k++)
  68. if (k!=j && (b[k]&i)!=b[k] && dp[i][j]+dis[j][k]<=key)
  69. {
  70. dp[i+b[k]][k]=Min(dp[i+b[k]][k],dp[i][j]+dis[j][k]);
  71. if (map[mark[k].x][mark[k].y]=='G') dp[i+b[k]][k]=0;
  72. if (((i+b[k])&aim)==aim) return 1;
  73. }
  74. }
  75. return 0;
  76.  
  77. }
  78. int main()
  79. {
  80. int i,j,l,r,mid,ans;
  81. b[0]=1;
  82. for (i=1;i<=16;i++)
  83. b[i]=b[i-1]*2;
  84. while (scanf("%d%d",&n,&m)!=EOF)
  85. {
  86. if (n==0 && m==0) break;
  87. cnt=0;
  88. getchar();
  89. for (i=0;i<n;i++)
  90. gets(map[i]);
  91.  
  92. aim=0;
  93. for (i=0;i<n;i++)
  94. for (j=0;j<m;j++)
  95. if (map[i][j]=='F' || map[i][j]=='Y' || map[i][j]=='G')
  96. {
  97. if (map[i][j]!='G') aim+=b[cnt];
  98. if (map[i][j]=='F') start=cnt;
  99. mark[cnt].x=i;
  100. mark[cnt].y=j;
  101. cnt++;
  102. }
  103.  
  104. memset(dis,inf,sizeof(dis));
  105. for (i=0;i<cnt;i++) // BFS出,F,Y,G之间的最短距离
  106. {
  107. bfs(mark[i].x,mark[i].y);
  108. for (j=0;j<cnt;j++)
  109. dis[i][j]=step[mark[j].x][mark[j].y];
  110. }
  111.  
  112. l=0; r=n*m;
  113. ans=-1;
  114. while (l<=r) // 二分电量
  115. {
  116. mid=(l+r)/2;
  117.  
  118. if (DP(mid)==1)
  119. {
  120. ans=mid;
  121. r=mid-1;
  122. }
  123. else
  124. l=mid+1;
  125. }
  126. printf("%d\n",ans);
  127.  
  128. }
  129. return 0;
  130. }

HDU 3681 BFS&amp;像缩进DP&amp;二分法的更多相关文章

  1. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  2. HDU 1074 Doing Homework(像缩进DP)

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  3. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  4. HDU 1024 Max Sum Plus Plus --- dp+滚动数组

    HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...

  5. HDU 1231 最大连续子序列 --- 入门DP

    HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...

  6. hdu 1044(bfs+状压)

    非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  7. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  8. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  9. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. Mybatis 3 返回布尔值,需要注意的地方

    在Mybatis中,有时候需要返回布尔值 ,来确定某个记录行是否存在. 例如: <select id="isExistCode" parameterType="st ...

  2. 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

    尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...

  3. C++ 指针—02 指针与引用的对照

    ★同样点: ●都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名. ★不同点: ●指针是一个实体,而引用仅是个别名: ●引用仅仅能在定义时被初始化一次,之后不可变: ...

  4. sql优化-提防错误关联

    在写sql时,在多表关联时,有时候容易把关联关系写错.一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了.今天写了一个脚本,碰到该问题了. 第一版本的脚本如下: select ...

  5. 破解.net程序 编译和反编译方法

    原文地址:http://www.cnblogs.com/li-peng/archive/2013/01/31/2886727.html 有好多.net程序有加密狗或者有验证,如果exe或dll没有做过 ...

  6. Android 布局之LinearLayout 子控件weight权重的作用详析(转)

    关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法 ...

  7. jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题

    jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互.特效.小部件及主题.无论您是创建高度交互的 Web 应用程序还是仅仅向窗体控件添加一个日期选择器,jQuery ...

  8. C++:抽象基类和纯虚函数的理解

    转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...

  9. 读取数据表中第m条到第n条的数据,SQL语句怎么写?

    原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...

  10. 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。

    原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...