题意:

给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数


本来是要做课件上一道$CF$题,先做一个简化版

只要保证图形有一个点在走出的多边形内就可以了

$hzc:$动态化静态的思想,假设已经有了路线怎么判断合法

点在多边形内是“点变多边形不变”,我们反过来维护多边形变

$f[i][j][0/1]$表示当前走到$(i,j)$,点是否在多边形内

维护一条向右发出的射线,每次走的时候看看有没有穿过射线就行了

因为这是个网格,我们可以规定只有从上面经过才算穿过

然后,这不是$DAG$啊怎么$DP?$

$spfa$大法好

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int N=,M=N*N<<;
  8. inline int read(){
  9. char c=getchar();int x=,f=;
  10. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  11. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  12. return x*f;
  13. }
  14. int n,m,g[N][N],sx,sy,a,b;
  15. int dx[]={,-,,,,-,,-},
  16. dy[]={,,,-,,-,-,};
  17. char s[N];
  18. int d[N][N][];
  19. struct Grid{
  20. int x,y,p;
  21. Grid(int a=,int b=,int c=):x(a),y(b),p(c){}
  22. }q[M];
  23. int head,tail,inq[N][N][];
  24. inline void lop(int &x){if(x==M) x=;}
  25. inline bool isInter(int x1,int y1,int x2,int y2){
  26. if(x1<a&&x2==a&&y2>b) return ;
  27. if(x2<a&&x1==a&&y1>b) return ;
  28. return ;
  29. }
  30. void spfa(){
  31. d[sx][sy][]=;
  32. head=tail=;
  33. q[tail++]=Grid(sx,sy,);inq[sx][sy][]=;
  34. while(head!=tail){
  35. Grid u=q[head++];lop(head);
  36. int x=u.x,y=u.y,p=u.p;//printf("\nnow %d %d %d\n",x,y,p);
  37. inq[x][y][p]=;
  38. for(int i=;i<;i++){
  39. int nx=x+dx[i],ny=y+dy[i];
  40. if(nx<||nx>m||ny<||ny>n||g[nx][ny]) continue;
  41. int np=p^isInter(x,y,nx,ny);//printf("lok %d %d %d\n",nx,ny,np);
  42. if(d[nx][ny][np]>d[x][y][p]+){//printf("new %d %d %d\n",nx,ny,np);
  43. d[nx][ny][np]=d[x][y][p]+;
  44. if(!inq[nx][ny][np])
  45. q[tail++]=Grid(nx,ny,np),lop(tail),inq[nx][ny][np]=;
  46. }
  47. }
  48. }
  49. printf("%d\n",d[sx][sy][]);
  50. }
  51. int main(){
  52. freopen("in","r",stdin);
  53. m=read();n=read();
  54. memset(d,,sizeof(d));
  55. for(int i=;i<=m;i++){
  56. scanf("%s",s+);
  57. for(int j=;j<=n;j++){
  58. g[i][j]=(s[j]=='X');
  59. if(s[j]=='*') sx=i,sy=j;
  60. else if(s[j]=='X'&&!a) a=i,b=j;
  61. }
  62. }
  63. //for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) printf("%d%c",g[i][j],j==n?'\n':' ');
  64. spfa();
  65. }

POJ 3182 The Grove [DP(spfa) 射线法]的更多相关文章

  1. poj 3182 The Grove

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 641   Accepted: 297 Descripti ...

  2. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  3. poj 3182 The Grove bfs

    思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...

  4. 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA

    [BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...

  5. POJ3182 The Grove[射线法+分层图最短路]

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 904   Accepted: 444 Descripti ...

  6. BZOJ 1656 [Usaco2006 Jan] The Grove 树木:bfs【射线法】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1656 题意: 给你一个n*m的地图,'.'表示空地,'X'表示树林,'*'表示起点. 所有 ...

  7. Codeforces 375C Circling Round Treasures - 最短路 - 射线法 - 位运算

    You have a map as a rectangle table. Each cell of the table is either an obstacle, or a treasure wit ...

  8. 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)

    题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...

  9. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

随机推荐

  1. 如何在SecureCRT中给linux上传和下载文件 安装redis

    首先建立文件 /download sz和rz命令无法用.则用以下1.和2.3步骤   需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运 ...

  2. js根据出生年月日换算年龄

    function age_Conversion(date) { debugger var age = ''; var str = date.replace(/年|月/g, "-") ...

  3. 数据库 MySQL基础知识

    (关于MySQL的安装,具体见下面博客:http://www.cnblogs.com/wj-1314/p/7573242.html) 一.什么是数据库 ? 数据库是按照数据结构来组织,存储和管理数据的 ...

  4. dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-15 17:33:07 我要评论 我们的模版里应该都有article_article.htm这个模版;article_article.htm ...

  5. DEDE中 field:rel 是什么意思,起一个什么样的作用效果

    DEDE中 field:rel 是什么意思,起一个什么样的作用效果 这是一段调用导航栏目的代码 {dede:channel type='top' row='10' } [field:typename/ ...

  6. TP5 中实现支付宝支付 利用model层调用支付宝类库

    <?php /** * Created by PhpStorm. * User: admin * Date: 2017/8/16 * Time: 09:16 */ namespace app\a ...

  7. MySQL浅谈 LEFT JOIN

    On条件(在“A left join b on conditional_expr”)决定如何从table B 中检索数据行(Matching-State); 如果B中没有行匹配On 条件,额外的B的所 ...

  8. UML图学习之三 状态图

    状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action). ...

  9. CentOS 7安装

    使用U盘安装 1.CentOS 7系统镜像制作U盘启动盘 1).下载CentOS 7系统镜像 下载地址:http://mirrors.aliyun.com/centos/7/isos/x86_64/ ...

  10. JS-输入金额校验

    function clearNoNum(obj){    obj.value = obj.value.replace(/[^\d.]/g,"");  //清除"数字&qu ...