POJ 3182 The Grove [DP(spfa) 射线法]
题意:
给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数
本来是要做课件上一道$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) 射线法]的更多相关文章
- poj 3182 The Grove
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 641 Accepted: 297 Descripti ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...
- 【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
[BZOJ1294][SCOI2009]围豆豆Bean Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别 ...
- POJ3182 The Grove[射线法+分层图最短路]
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 904 Accepted: 444 Descripti ...
- BZOJ 1656 [Usaco2006 Jan] The Grove 树木:bfs【射线法】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1656 题意: 给你一个n*m的地图,'.'表示空地,'X'表示树林,'*'表示起点. 所有 ...
- 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 ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
随机推荐
- c语言基础学习07
============================================================================= 涉及到的知识点有: 1.指针.指针的概念.指 ...
- html5 文本格式化
通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替换 <i>标签使用.然而,这些标签的含义是不同的:<b> 与< ...
- 面试-java算法题
1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) retur ...
- Vue-cli搭建完项目,各文件解释
脚手架vue-cli搭建完成后,会生成一些文件,总结学习一下这些文件是做什么用的:1.一级目录: build和config文件夹是wbepack配置的文件夹: node_modules是在我npm i ...
- GDI绘制时钟效果,与系统时间保持同步,基于Winform
2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...
- JS高级用法
1.重复定时器 setTimeout(function() { // 处理中 setTimeout(arguments.callee, 1000); }, 1000) 这种模式链式调用了 setTim ...
- JSP学习总结
1. 为什么需要jsp? Servlet对于逻辑处理是非常方便的,但是对于页面的展现是非常麻烦的.JSP的诞生是为了解决Servlet页面展现麻烦的问题的. 2. JSP的特点: Jsp页面 ...
- WdatePicker时间插件
next_door_boy CnBlogs Home New Post Contact Admin Rss Posts - 14 Articles - 5 Comments - 0 WdateP ...
- Java的栈和队列
package com.ipmotor.sm.db;import java.util.LinkedList;import java.util.Queue;import java.util.Stack; ...
- linux_ssh
什么是ssh? 配置文件位置:/etc/ssh/sshd_config 远程登录和为其他网络提供安全的加密数据传输协议,默认端口22,默认协议是SSH2 # 远程终端通过ssh连接服务器管理服务器 # ...