原文链接http://www.cnblogs.com/zhouzhendong/p/8371735.html


题目传送门 - BZOJ3393


题意概括

  直接看原题的翻译吧,很容易懂的。

  


题解

  我不知道这道题为什么放在网络流里面。

  我也不知道网上为什么几乎都是SPFA。

  这题就是一个裸的广搜啊啊啊。

  20ms通过。

  我们来考虑广搜。

  只有改变方向是要花费的。

  所以,我们入队的时候是一条线上的一起入队。

  具体看我的pushnew函数。

  然后主要的BFS循环内,只要扩展转弯就可以了(参见代码)。

  我们考虑到,我这样做会导致在一个位置上进行多次转弯。

  多次转弯,貌似是错的,但是由于本题特殊,这样一定是亏的,不会作为最优方案。

  大概分成两种情况。

  我们考虑如果只转了一次,显然是对的。

  如果转了3次及以上,显然是亏的。

  如果转了2次,只有可能:

    1.原方向行进,显然是亏的。

    2.原路返回,显然也是亏的。(自己脑补一下)

  还有一个疑惑:比如下图的路线是否可能为最优路线(我的算法有可能会搜出这样的路线):

  

  于是在(0,5)这个位置的镜子显然不对了。

  但是这个显然不会是最优路线,直接挂掉。


代码

#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int WH=105,N=4*WH*WH;
int w,h,S,E,dis[N],vis[N],q[N],head,tail;
char g[WH][WH];
int dx[4]={-1, 0, 1, 0};
int dy[4]={ 0, 1, 0,-1};
char gc(){
char ch=getchar();
while (ch!='.'&&ch!='*'&&ch!='C')
ch=getchar();
return ch;
}
bool check(int x,int y){
return 1<=x&&x<=w&&1<=y&&y<=h&&g[x][y]!='*';
}
int HA(int dir,int x,int y){
return dir*w*h+(x-1)*h+y-1;
}
void HB(int v,int &dir,int &x,int &y){
dir=v/w/h,v%=w*h,x=v/h+1,y=v%h+1;
}
bool covered(int v1,int v2){
return v1%(w*h)==v2%(w*h);
}
void pushnew(int dir,int x,int y,int d){
while (check(x,y)){
int i=HA(dir,x,y);
if (vis[i])
break;
vis[i]=1,dis[i]=d;
q[++tail]=i;
x+=dx[dir],y+=dy[dir];
}
}
int main(){
scanf("%d%d",&h,&w);
for (int i=1;i<=w;i++)
for (int j=1;j<=h;j++)
g[i][j]=gc();
S=E=-1;
for (int i=1;i<=w;i++)
for (int j=1;j<=h;j++)
if (g[i][j]=='C')
if (!~S)
S=(i-1)*h+j-1;
else
E=(i-1)*h+j-1;
memset(vis,0,sizeof vis);
head=tail=0;
for (int i=0;i<4;i++)
dis[HA(i,E/h+1,E%h+1)]=w*h;
for (int i=0;i<4;i++)
pushnew(i,S/h+1,S%h+1,0);
while (head<tail){
int v=q[++head],dir,x,y;
if (covered(v,E))
break;
HB(v,dir,x,y);
pushnew((dir+1)%4,x,y,dis[v]+1);
pushnew((dir+3)%4,x,y,dis[v]+1);
}
int ans=w*h;
for (int i=0;i<4;i++)
ans=min(ans,dis[HA(i,E/h+1,E%h+1)]);
printf("%d",ans);
return 0;
}

  

BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS的更多相关文章

  1. bzoj3393 [Usaco2009 Jan]Laserphones 激光通讯

    Description Input 第1行输入w和H,之后W行H列输入地图,图上符号意义如题目描述. Output 最少的对角镜数量. Sample Input 7 8 ....... ...... ...

  2. BZOJ3393:[USACO LPHONE] 激光通讯

    分层图+堆优化的dijkstra 将原图分为4层,分别是只向上,向下,向左,向右建立边,然后层与层之间的转移很好处理.稠密图,应该用堆优化的dijkstra. //OJ 1845 //by Cydia ...

  3. BZOJ3396: [Usaco2009 Jan]Total flow 水流

    3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 45  Solved: 27[Sub ...

  4. bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 665  Solved: 227[Sub ...

  5. BZOJ3394: [Usaco2009 Jan]Best Spot 最佳牧场

    3394: [Usaco2009 Jan]Best Spot 最佳牧场 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 11  Solved: 9[Sub ...

  6. 1574: [Usaco2009 Jan]地震损坏Damage

    1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 232[Subm ...

  7. 3396: [Usaco2009 Jan]Total flow 水流

    3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 179  Solved: 73[Su ...

  8. 【BZOJ1576】[Usaco2009 Jan]安全路经Travel 最短路+并查集

    [BZOJ1576][Usaco2009 Jan]安全路经Travel Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, ...

  9. 【思维题 并查集 图论】bzoj1576: [Usaco2009 Jan]安全路经Travel

    有趣的思考题 Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第 ...

随机推荐

  1. Android App增量升级

    移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力.说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面, ...

  2. [JavaScript]使用ArrayBuffer和Blob编辑二进制流

    Blob()构造方法返回一个新的Blob对象. 内容是包含参数array的二进制字节流. 语法 var aBlob = new Blob( array, options ); 参数 array is ...

  3. centos7编译安装lnmp

    1.前言 本文适合于已经对Linux操作系统具有基本操作经验,并且能够在Linux或Windows上通过一键搭建工具或者yum命令行进行环境搭建的读者,阅读本文需具有一定的专业知识,本文不建议初学者阅 ...

  4. GoLand使用

    # 不定期更新 什么是GoLand GoLand是JetBrains出品的一个Go语言IDE,JB的IDE有多好用我想很多程序员都知道,个人感觉唯一的缺点就是比较大(因为功能多) 希望大家多多支持正版 ...

  5. AES对数据进行加密与解密

    AES对数据进行加密与解密随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即A ...

  6. Linux端BaiduPCS-Go使用方法

    下载https://pan.baidu.com/s/1RFHTRE1c_JlP8rrZiERsTg 运行 ./BaiduPCS-Go 可能更新:update 登录:login 下载: d xxx 更多 ...

  7. verilog-testbench 时钟和复位模板

    /********************************************* ** Clocks & Reset ******************************* ...

  8. MySQL多表查询 三表查询 连接查询的套路

    多表查询 * 当我们的一条记录 分散不同的表中时,就需要进行多表查询 例如 一对一 一对多 多对多 1.笛卡尔积查询 意思是将两个表中的所有数据 全部关联在一起   例如 a表 有2条 b表有3条   ...

  9. C#概念总结(五)

    1.C#特性 (Attribute) 特性适用于在运行时传递程序中的各中元素(比如 类.方法.结构.枚举.组件)的行为信息额声明性标签,可以通过使用特性向程序添加声明性信息,一个声明标签是通过放置在他 ...

  10. OAuth2 token

    1.资源服务器 package com.ruhuanxingyun.config; import com.fasterxml.jackson.databind.ObjectMapper; import ...