原文链接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. linux /proc目录

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  2. 【原创】运维基础之Docker(5)docker部署airflow

    部署方式:docker+airflow+mysql+LocalExecutor 使用airflow的docker镜像 https://hub.docker.com/r/puckel/docker-ai ...

  3. 请在微信客户端打开链接 html

    1 前言 有时候,需要链接只能在微信上打开,如果不是,则提示请在微信客户端打开链接的字眼的网页,网页代码如下:(这个是网页应用授权时,非微信上打开,就会出现,然后把它单独拿出来了) 2 代码 < ...

  4. mysql服务器没有响应

    第一步删除c:\windowns下面的my.ini(可以先改成其它的名字也行) 第二步打开对应安装目录下\mysql\bin\winmysqladmin.exe 输入用户名 和密码(也可以忽略此步) ...

  5. day03 变量 运算符 基本数据类型 输出功能 格式化输出

    变量补充 变量的命名 1变量名的命名的大前提:应该能够反映出变量值所记录的状态 具体的1.变量名由字母数字下划线组成 2.不能以数字开头 3.不能使用关键字命名为变量名 两种写法 1.驼峰体(由字母组 ...

  6. SpringMVC文件下载与JSON格式

    点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...

  7. Windows 系统共享文件扫描

    近年来历次泄露的安全事故(工控安全),其主要原因就是内部网络自身的脆弱性问题.对于内部网络的安全检查是很必要的.传统上使用CMD命令  net view 就可以扫描在线的主机但是,主机设置取消QOS的 ...

  8. zoj3471 状态压缩dp基础

    /* dp[S]表示状态S下的最大收益,0表示没有了,1表示还在 */ #include<bits/stdc++.h> using namespace std; <<],mp[ ...

  9. python操作注册表

    #注册表操作 # -*- coding: utf-8 -*- import win32api import win32con #打开注册表:传主键化值,子键值,操作方法(win32con.KEY_AL ...

  10. JMeter 中跨线程组 变量值传递的方法

    关于jmeter中跨线程组 变量值传递的方法         找了好久,终于找到方法了,赶紧整理下来. 1.在线程组1 中使用__setProperty函数设置jmeter属性值(此值为全局变量值), ...