原文链接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. List<T>常用操作

    1.List<T>类型强制转换: List<UIData> datalist=null;datalist.ConvertAll<object>(input => ...

  2. 前端 ---- jQuery的ajax

    14-jQuery的ajax   什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下, ...

  3. MySQL建库建表

    一直使用SQL SERVER 数据库:最近项目使用MY SQL感觉还是有一点不适应.不过熟悉之后就会好很多. MY SQL 安装之后会有一个管理工具MySQL Workbench 感觉不太好用,数据库 ...

  4. 【原创】大叔经验分享(32)docker挂载文件修改生效

    docker经常需要挂载文件到容器中,比如启动nginx # docker run -d --name test_nginx -v /tmp/nginx.conf:/etc/nginx/nginx.c ...

  5. Hystrix系列-5-Hystrix的资源隔离策略

    转自:https://blog.csdn.net/liuchuanhong1/article/details/73718794 Hystrix的资源隔离策略有两种,分别为:线程池和信号量. 说到资源隔 ...

  6. AES加解密程序的实现

    AES加解密程序的实现正常情况,用户不能访问sys.dbms_crypto,需要DBA授权:grant execute on dbms_crypto to crm;建立加解密的PKG_AES包:CRE ...

  7. Google开发者大会:你不得不知的Tensorflow小技巧

    Google开发者大会:你不得不知的Tensorflow小技巧 同步滚动:开   Google Development Days China 2018近日在中国召开了.非常遗憾,小编因为不可抗性因素滞 ...

  8. 分享一份非常强势的Android面试题

    马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考链接: https://blog.c ...

  9. js调用ajax案例2,使用ok

    XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) ...

  10. linux之ab压力测试工具

    等待... https://www.cnblogs.com/myvic/p/7703973.html