题解:

spfa

允许多次进队

代码:

#include<bits/stdc++.h>
using namespace std;
struct que{int x,y,dire,dist;}now,wrk;
bool operator<(const que &a,const que &b){return a.dist>b.dist;}
priority_queue <que> q;
const int mx[]={,,,-},my[]={,,-,};
int n,m,sx,sy,ex,ey,mrk[][],dist[][][];
int main()
{
scanf("%d%d",&m,&n);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
char ch=getchar();
while (ch!='C'&&ch!='.'&&ch!='*')ch=getchar();
if (ch=='*')mrk[i][j]=;
if (ch=='C')
{
if (!sx){sx=i;sy=j;}
else {ex=i;ey=j;}
}
}
memset(dist,,sizeof(dist));
now.x=sx;now.y=sy;now.dist=;
for (int i=;i<;i++)
{
now.dire=i;
q.push(now);
dist[sx][sy][i]=;
}
while (!q.empty())
{
now=q.top();q.pop();
int k=now.dire;
wrk=now;
while (wrk.x+mx[k]>=&&wrk.x+mx[k]<=n&&wrk.y+my[k]>=
&&wrk.y+my[k]<=m&&!mrk[wrk.x+mx[k]][wrk.y+my[k]]
&&dist[wrk.x+mx[k]][wrk.y+my[k]][k]>wrk.dist)
{
wrk.x+=mx[k];wrk.y+=my[k];
dist[wrk.x][wrk.y][k]=dist[now.x][now.y][k];
q.push(wrk);
}
wrk=now;wrk.dist++;
for (int k=;k<;k++)
if(dist[now.x][now.y][k]>now.dist+)
{
dist[now.x][now.y][k]=now.dist+;
wrk.dire=k;
q.push(wrk);
}
}
int ans=1e9;
for (int k=;k<;k++)
ans=min(ans,dist[ex][ey][k]);
printf("%d\n",ans);
}

bzoj3393的更多相关文章

  1. BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS

    原文链接http://www.cnblogs.com/zhouzhendong/p/8371735.html 题目传送门 - BZOJ3393 题意概括 直接看原题的翻译吧,很容易懂的. 题解 我不知 ...

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

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

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

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

随机推荐

  1. Git 进阶之底层相关

    Git is a content-addressable filesystem. 1. Plumbing 和 Porcelain "Plumbing commands": Git ...

  2. chm帮助文档制作及C#调用

    http://zhoufoxcn.blog.51cto.com/792419/166049 http://wenku.baidu.com/view/a90adbd249649b6648d74794.h ...

  3. SchuledExecutorService 使用controller控制线程关闭

    1:SchuledExecutorService  使用controller控制线程关闭 package com.li.controller; import org.springframework.s ...

  4. Spark的RDD原理以及2.0特性的介绍

    转载自:http://www.tuicool.com/articles/7VNfyif 王联辉,曾在腾讯,Intel 等公司从事大数据相关的工作.2013 年 - 2016 年先后负责腾讯 Yarn ...

  5. JS随机数种子

    JS随机数种子 1 试着想一下,如果在某一个场景,我们做一个游戏,用户玩到一半的时候退出了,这样 用户下次进来可以选择继续上一次的进度继续玩,那么现在问题来了:用户玩 的进度以及用户的积分等简单的描述 ...

  6. Java IO的Reactor模式

    1.    Reactor出现的原因 Reator模式是大多数IO相关组件如Netty.Redis在使用时的IO模式,为什么需要这种模式,如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务 ...

  7. BurpSuite工具应用

    BurpSuite工具应用 BurpSuite是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP ...

  8. Xshell5 访问虚拟机Ubuntu16.04

    1.Ubuntu安装telnet 安装openbsd-inetd sudo apt-get install openbsd-inetd 安装telnetd sudo apt-get install t ...

  9. jsoop_封装

    <script> //java.utils.ArrayList() //包(命名空间) /* var java = {}; java.utils = {}; java.utils.Arra ...

  10. C++网络通信字节序问题

    htonl(), ntohl(), htons(), ntohs() 函数 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), n ...