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的更多相关文章

  1. Luogu P2864 [USACO06JAN]树林The Grove(bfs)

    P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...

  2. [USACO06JAN]树林The Grove

    树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...

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

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

  4. bzoj:1656 [Usaco2006 Jan] The Grove 树木

    Description The pasture contains a small, contiguous grove of trees that has no 'holes' in the middl ...

  5. 【Noip模拟 20160929】树林

    题目描述 现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子. 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下 ...

  6. 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...

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

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

  8. poj 3182 The Grove

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

  9. Luogu2860 [USACO06JAN]冗余路径Redundant Paths

    Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...

随机推荐

  1. 计蒜客 30990 - An Olympian Math Problem - [简单数学题][2018ICPC南京网络预赛A题]

    题目链接:https://nanti.jisuanke.com/t/30990 Alice, a student of grade 6, is thinking about an Olympian M ...

  2. Gym - 101628F Find the Inn dijkstra,读边时计算新权值

    题意: 给n个点m条边及每条边所花费的时间,经过给定的p个点时会停留k秒,要求在t秒内从1号点走到n号点,若可以走到输出最短时间,若不行输出-1.. 题解:读取边时,将每个点停留的时间加到以其为终点的 ...

  3. LAMP下安装zabbix流水

    一.安装zabbix (1)创建用户和组 [root@dbking zabbix-2.2.1]# groupadd zabbix [root@dbking zabbix-2.2.1]# useradd ...

  4. Python的浅拷贝与深拷贝

    定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...

  5. Linux 下用 crontab 设置定时执行python 程序

    Linux 下用 crontab 设置定时执行python 程序 方法/步骤   1,先大概了解crontab,/etc/crontab 就是crontab 的配置文件. crontab命令详解可以查 ...

  6. mysql python pymysql模块 基本使用

    我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢? 这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装 pi ...

  7. redis 介绍

    缓存数据库介绍 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是 ...

  8. vue:Group XSwitch Actionsheet,Toast控件使用

    <template> <div> <div class="vux-demo"> <img class="logo" s ...

  9. 更改docker服务网段分配地址

    docker安装完毕后,会自动生成一个网卡名为docker0的网桥,如果其默认分配的网段地址和已有地址段冲突,可按如下步骤修改. 查看默认地址段如下 docker0: flags=4099<UP ...

  10. [LeetCode] 207 Course Schedule_Medium tag: BFS, DFS

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...