题目链接:http://poj.org/problem?id=2049

解题报告:

网格中的BFS,最主要的是边界问题。

1、这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for(int j=0;j<t;j++) ya[x][y+1+j]=WALL;   ymax=max(y+t+1,ymax);xmax=max(x+1,xmax);

2、这里采用的是逆向BFS,从dis[1][1]出发,输出dis[tx][ty];

  1. #include <iostream>
  2. #include <queue>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAXV 210
  9. #define INF 1<<29
  10. #define min(a,b) (a>b?b:a)
  11. #define max(a,b) (a>b?a:b)
  12.  
  13. #define EMPTY 0
  14. #define DOOR 1
  15. #define WALL INF
  16.  
  17. int xa[MAXV][MAXV]; ///在x方向上添上墙
  18. int ya[MAXV][MAXV]; ///在y方向上添上墙
  19.  
  20. int dis[MAXV][MAXV]; ///目标答案,dis[i][j]先初始化为无穷,然后置dis[1][1]为0,
  21. ///根据x,y方向上的是否有墙,自增,没有墙置+0,有门+1,dis[tx][ty]也就是答案
  22.  
  23. int dt[][]= {{-,},{,},{,-},{,}}; ///四个方向分别是向上,向下,向左,向右
  24.  
  25. int xmax,ymax; ///x,y方向上的边界
  26.  
  27. ///判断是否在图表中
  28. bool pd(int x,int y)
  29. {
  30. if(x> && x<=xmax && y<=ymax && y>) return ;
  31. return ;
  32. }
  33.  
  34. int getvalue(int x,int y,int i)
  35. {
  36. if(i==) return ya[x-][y];
  37. if(i==) return ya[x][y];
  38. if(i==) return xa[x][y-];
  39. return xa[x][y];
  40. }
  41.  
  42. ///逆向广搜
  43. int bfs(int tx,int ty)
  44. {
  45. int i,j,vx,vy,dx,dy,tmp;
  46. queue <int>q;
  47.  
  48. ///初始化
  49. for(i=; i<=ymax; i++)
  50. {
  51. for(j=; j<=xmax; j++)
  52. dis[i][j]=INF;
  53. }
  54.  
  55. dis[][]=;
  56. q.push();
  57. q.push();
  58. while(!q.empty())
  59. {
  60. vx=q.front();
  61. q.pop();
  62. vy=q.front();
  63. q.pop();
  64.  
  65. for(i=; i<; i++)
  66. {
  67. dx=vx+dt[i][];
  68. dy=vy+dt[i][];
  69.  
  70. tmp=getvalue(vx,vy,i); ///tmp为这个格子是否为墙,门,什么都没有,分别对应inf,1,0
  71. if(pd(dx,dy) && dis[dx][dy]>dis[vx][vy]+tmp)
  72. {
  73. dis[dx][dy]=dis[vx][vy]+tmp;
  74. q.push(dx);
  75. q.push(dy);
  76. }
  77. }
  78. }
  79. return (dis[tx][ty]==INF?-:dis[tx][ty]);
  80. }
  81.  
  82. int main()
  83. {
  84. int n,m,i,j;
  85. int x,y,d,t;
  86. double sx,sy;
  87. while(scanf("%d%d",&m,&n))
  88. {
  89. ///m个墙,n个门
  90. if(m==- && n==-) break;
  91.  
  92. ymax=xmax=-;
  93. memset(xa,EMPTY,sizeof(xa));
  94. memset(ya,EMPTY,sizeof(ya));
  95. for(i=; i<m; i++)
  96. {
  97. scanf("%d%d%d%d",&x,&y,&d,&t);
  98. if(d) ///向上有墙
  99. {
  100. for(j=; j<t; j++)
  101. ya[x][y+j+]=WALL;
  102. ymax=max(y+t+,ymax);
  103. xmax=max(x+,xmax);
  104. }
  105. else
  106. {
  107. for(j=; j<t; j++)
  108. xa[x+j+][y]=WALL;
  109. ymax=max(y+,ymax);
  110. xmax=max(x+t+,xmax);
  111. }
  112. }
  113.  
  114. for(i=; i<n; i++)
  115. {
  116. scanf("%d%d%d",&x,&y,&d);
  117. if(d) ya[x][y+]=DOOR;
  118. else xa[x+][y]=DOOR;
  119. }
  120.  
  121. scanf("%lf%lf",&sx,&sy);
  122. if(!(sx>= && sx<= && sy>= && sy<=)) printf("0\n");
  123. else printf("%d\n",bfs((int)sx+,(int)sy+));
  124. }
  125. return ;
  126. }

参考:http://blog.csdn.net/wangjian8006/article/details/7997609

网格中的BFS,逆向(POJ2049)的更多相关文章

  1. 搜索(BFS)---计算在网格中从原点到特定点的最短路径长度

    计算在网格中从原点到特定点的最短路径长度 [[1,1,0,1], [1,0,1,0], [1,1,1,1], [1,0,1,1]] 题目描述: 1表示可以经过某个地方,求解从(0,0)位置到(tr,t ...

  2. VMware 设备VMnet0 上的网桥暂时关闭。此虚拟机无法与主机或网格中的其他计算机通信【转】

    今天克隆了一个win7的虚拟机,移动到我的本地.打开时发现虚拟机网格连接图标出现X断开连接,于是网上收了一堆答案无一个可用的,决定自己解决这个问题,解决过程如下: 1.报错图如下:设备VMnet0 上 ...

  3. csuoj 1117: 网格中的三角形

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1117 1117: 网格中的三角形 Time Limit: 3 Sec  Memory Limit: ...

  4. eclipse中使用mybatis-generator逆向代码生成工具问题解决记录

    问题一: eclipse中使用mybatis-generator逆向代码生成工具出现waiting for "building  workspace" 解决办法: 选择菜单栏的   ...

  5. P2295 MICE 网格中的DP

    题目描述 分析 很好的一道网格中的\(DP\)题 我们设\(f[x][y]\)为小象到达坐标为\((x,y)\)的点时看到的最少的老鼠的数量 但是这样定义是不好转移的,因为小象可能从上面的格子转移下来 ...

  6. sigma网格中水平压力梯度误差及其修正

    1.水平梯度误差产生 sigma坐标系下,笛卡尔坐标内水平梯度项对应形式为 \[\begin{equation} \left. \frac{\partial }{\partial x} \right| ...

  7. Istio(十一):向istio服务网格中引入虚拟机

    目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...

  8. n行m列的网格中含有的矩形数

    给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形 公式:[ n(n+1)*m(m+1)]/4 直接想问题比较复杂,可以先考虑矩形的长,再考虑矩形的高,由对称性可知最后的结果中m和n对称 ...

  9. (3)PyCharm中Flask工程逆向生成数据库表

    一.创建数据库 在mysql数据库中创建名为"movie"的数据库. 二.安装SQLAlchemy 三.安装PyMySQL 四.创建数据模型 在app/models.py中编写数据 ...

随机推荐

  1. Wireshark抓取TCP包分析

    介绍 本篇文章是使用wireshrak对某个https请求的tcp包进行分析. 目的 通过抓包实际分析了解tcp包. 准备工作 在我自己机子上安装的是wireshark2.2.6版本,随机查找了某个T ...

  2. vmware 三种连接方式 如何设置独立ip

    转载:https://blog.csdn.net/xiaoyangsavvy/article/details/73718473

  3. Python Pandas -- DataFrame

    pandas.DataFrame class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False) ...

  4. JavaSE---使用反射生成JDK动态代理

    1.概述 1.1 在Java.lang.reflect包下,提供了Proxy类.InvocationHandler接口,使用它们可以生成JDK动态代理类或动态代理对象: 1.2 [Proxy类] 1. ...

  5. JS 获取get请求方式的参数

    //获取页面中的参数    name值参数名称(例如:http://localhost:8099/index.aspx?id=10,name则指的是id)function GetQueryString ...

  6. The Falling Leaves UVA - 699

    题目链接:https://vjudge.net/problem/UVA-699 题目大意:给一颗二叉树,每个结点都有一个水平位置 :左子节点在它左边的1个单位,右子结点在它右边1个单位.从左向右输出每 ...

  7. 手机缺失sqlite3时操作数据库的多种解决方案 ----adb命令科普

    在Android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 下面我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方案 ...

  8. 创建weblogic受管理服务器和安全文件

    启动 admin server Oracle/Middleware/user_projects/domains/base_domain/bin> startWebLogic.sh 1创建受管服务 ...

  9. DedeCms中Channel用typeid无效

    DedeCms中channel 用typeid调用无法达目的吗?请换成type试试! {dede:channel type='son' typeid='19' row='1'} <a href= ...

  10. Assignment 1:Chinese Text Data Processing.

    记录过程. Lucene分词:http://blog.csdn.net/cyxlzzs/article/details/7999212 Lucene自定义词典:http://lilongbao.blo ...