题意:

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


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

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

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

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

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

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

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

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

$spfa$大法好

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=,M=N*N<<;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,g[N][N],sx,sy,a,b;
int dx[]={,-,,,,-,,-},
dy[]={,,,-,,-,-,};
char s[N];
int d[N][N][];
struct Grid{
int x,y,p;
Grid(int a=,int b=,int c=):x(a),y(b),p(c){}
}q[M];
int head,tail,inq[N][N][];
inline void lop(int &x){if(x==M) x=;}
inline bool isInter(int x1,int y1,int x2,int y2){
if(x1<a&&x2==a&&y2>b) return ;
if(x2<a&&x1==a&&y1>b) return ;
return ;
}
void spfa(){
d[sx][sy][]=;
head=tail=;
q[tail++]=Grid(sx,sy,);inq[sx][sy][]=;
while(head!=tail){
Grid u=q[head++];lop(head);
int x=u.x,y=u.y,p=u.p;//printf("\nnow %d %d %d\n",x,y,p);
inq[x][y][p]=;
for(int i=;i<;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<||nx>m||ny<||ny>n||g[nx][ny]) continue;
int np=p^isInter(x,y,nx,ny);//printf("lok %d %d %d\n",nx,ny,np);
if(d[nx][ny][np]>d[x][y][p]+){//printf("new %d %d %d\n",nx,ny,np);
d[nx][ny][np]=d[x][y][p]+;
if(!inq[nx][ny][np])
q[tail++]=Grid(nx,ny,np),lop(tail),inq[nx][ny][np]=;
}
}
}
printf("%d\n",d[sx][sy][]);
}
int main(){
freopen("in","r",stdin);
m=read();n=read();
memset(d,,sizeof(d));
for(int i=;i<=m;i++){
scanf("%s",s+);
for(int j=;j<=n;j++){
g[i][j]=(s[j]=='X');
if(s[j]=='*') sx=i,sy=j;
else if(s[j]=='X'&&!a) a=i,b=j;
}
}
//for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) printf("%d%c",g[i][j],j==n?'\n':' ');
spfa();
}

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. java与C++变量初始化的对比

    java尽力保证:所有变量在使用前都能得到恰当的初始化 ①函数/方法局部变量的初始化 在C/C++中,变量的初始化还是得依赖于程序员的自觉性.对于函数局部变量,编译器不会为基本类型赋予默认初始值,新手 ...

  2. 将电脑文件复制到vm虚拟机中,然后安装步骤

    [root@lixiaohu 桌面]# cp openssl-1.0.1f.tar.gz /usr/src     /usr/src  这是复制到的路径[root@lixiaohu 桌面]# cd / ...

  3. MLlib--决策树

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/d65ab6ccff684db729f44a947ac9e7da.html 决策树 1.什么是决策树    决策 ...

  4. Spark算子--first、count、reduce、collect、lookup

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/4b8582c8dde1529abb11e4ccc8296171.html first.count.reduce ...

  5. 分享给有需要的你,精选了10套web开发免费视频教程~~

    在这里给大家精选百度传课里的一些比较好的视频教程,比较适合新手们,有需要的可以收藏着学习!!  蓝鸥微信小程序全方位深度解析 链接:http://www.chuanke.com/v4702151-19 ...

  6. vuethink 在本地没问题,在服务器报错 , php5.6与php5.5之间的大坑

    将环境换为php5.6即可

  7. Intellij idea 导入 jdbc

    第一步,去官网https://dev.mysql.com/downloads/connector/j/ 下载驱动程序 第二步,解压压缩包,记住路径 第三步,打开你的idea工程,打开Project S ...

  8. input标签元素,value属性取值问题,赋值

    验证val:<input type="text" id="id" name="name" value="空值"&g ...

  9. Sublime Text 2激活、插件包安装、以及快捷键

    http://jingyan.baidu.com/article/ff4116259b057c12e48237b8.html Sublime Text作为一款轻量.简洁.高效.跨平台的编辑器.支持N多 ...

  10. Java calendar获取月份注意事项

    Calendar中月份month得取值是从0开始,到11,对应着日历中的1-12月.所以在用此取月份的话,需要在原有基础上加1.