P2864 [USACO06JAN]树林The Grove
神奇的射线法+bfs
裸的bfs很难写.......
那么我们找一个最外围障碍点,向图的外边引一条虚拟射线。
蓝后bfs时经过这条射线奇数次最后又回到起点的,就是满足条件的路径
最后来个bfs+记忆化
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- #define N 55
- const int d1[]={-,,,,-,-,,};
- const int d2[]={,,-,,-,,-,};
- struct data{
- int x,y,k;//k:穿过次数
- data(){}
- data(int A,int B,int C):
- x(A),y(B),k(C){}
- }; queue <data> h;
- int n,m,gx,gy,tx,ty,d[N][N][];
- char q[N]; bool a[N][N];
- bool across(data f,data t){
- if(gx==f.x&&gy>f.y&&gx>t.x) return ;//自下而上穿过
- if(gx==t.x&&gy>t.y&&gx>f.x) return ;//自上而下穿过
- return ;
- }
- int main(){
- memset(d,,sizeof(d));
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;++i){
- scanf("%s",q+);
- for(int j=;j<=m;++j){
- if(q[j]=='X'){
- a[i][j]=;
- if(!gx) gx=i,gy=j;//找一个障碍点,最好是外围的
- }else if(q[j]=='*'){
- d[tx=i][ty=j][]=;
- h.push(data(i,j,));
- }
- }
- }
- while(!h.empty()){
- data u=h.front(),p; h.pop();
- for(int i=;i<;++i){
- p=data(u.x+d1[i],u.y+d2[i],u.k);
- if(p.x<||p.x>n||p.y<||p.y>m)
- continue;
- if(a[p.x][p.y]) continue;
- if(across(u,p)) p.k^=;
- if(d[p.x][p.y][p.k]<=d[u.x][u.y][u.k]+)
- continue;
- d[p.x][p.y][p.k]=d[u.x][u.y][u.k]+;
- h.push(p);
- }
- }printf("%d",d[tx][ty][]);//穿过奇数次回到起点的
- return ;
- }
P2864 [USACO06JAN]树林The Grove的更多相关文章
- Luogu P2864 [USACO06JAN]树林The Grove(bfs)
P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...
- [USACO06JAN]树林The Grove
树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- bzoj:1656 [Usaco2006 Jan] The Grove 树木
Description The pasture contains a small, contiguous grove of trees that has no 'holes' in the middl ...
- 【Noip模拟 20160929】树林
题目描述 现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子. 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下 ...
- 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...
- POJ3182 The Grove[射线法+分层图最短路]
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 904 Accepted: 444 Descripti ...
- poj 3182 The Grove
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 641 Accepted: 297 Descripti ...
- Luogu2860 [USACO06JAN]冗余路径Redundant Paths
Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...
随机推荐
- poj3614 Sunscreen【贪心】
Sunscreen Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11772 Accepted: 4143 Descri ...
- POJ 1700 - Crossing River
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13982 Accepted: 5349 Description A gr ...
- POJ 1149 - PIGS - [最大流构图]
Time Limit: 1000MS Memory Limit: 10000K Description Mirko works on a pig farm that consists of M loc ...
- 2018/03/15 每日一个Linux命令 之 mv
Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. mv [参数] [要移动/更名的文件] [移动路径/要更改名字] 平常用的很多了,这里就不多讲解了,只介绍两个重要参数就好了 - ...
- sql两列相除,保留n位小数
), ) from tablename 以上代码意思两列相处,然后保留4位小数.
- Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yanglfree/article/details/33333413 一.概述 最新版的百度地图SDK ...
- Linear Regression Using Gradient Descent 代码实现
参考吴恩达<机器学习>, 进行 Octave, Python(Numpy), C++(Eigen) 的原理实现, 同时用 scikit-learn, TensorFlow, dlib 进行 ...
- jmeter 正则表达式提取器的使用(提取第一个匹配结果)
原文地址https://www.cnblogs.com/xueli/p/7405258.html?utm_source=itdadao&utm_medium=referral 正则表达式的用处 ...
- 常用软件安装及VS插件工具
常用开发工具安装 开发环境 Visual Studio 2013 Microsoft SQL Server 2008 源代码管理 Git TortoiseGit GitScc Provider Cru ...
- lambda函数和map函数
lambda函数,简化了函数定义的书写形式,使代码更为简洁,但是使用自定义函数的定义方式更为直观,易理解 g = lambda x:x+1 #上面的lambda表达式相当于下面的自定义函数 def g ...