看到这题,一下就想到了爆搜。(不过这题输入也是够坑的)

单纯的搜索肯定是会超时的,所以这里需要考虑一些剪枝。

我们令bin[i][j][k]为在第i行j列时,方向为k的最小镜子数,若当时的镜子数已大于或等于此记录,那么就不必要更新了

否则往该点的四个方向进行更新:

  • 方向相同

没必要放镜子了

  • 方向相反

不存在这种可能,忽略(否则你的镜子要怎么放呢?)

  • 其他

放一面镜子,更新方向

BFS代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100+10;
char Map[MAXN][MAXN];
int n,m;
int bx,by,ex,ey;
int dx[5]={0,0,1,0,-1};
int dy[5]={0,1,0,-1,0};
int ans=0x3f3f3f3f;
int bin[MAXN][MAXN][5];//剪枝用
struct Node
{
int x,y;
int cnt;
int dir;//表示的方向
/*
1:right
2:down
3:left
4:up
*/
};
inline int read()
{
int tot=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
tot=tot*10+c-'0';
c=getchar();
}
return tot;
}
inline void BFS()
{
queue<Node>q;
q.push((Node){bx,by,0,1});//推四种方向到队列中
q.push((Node){bx,by,0,2});
q.push((Node){bx,by,0,3});
q.push((Node){bx,by,0,4});
bin[bx][by][1]=bin[bx][by][2]=bin[bx][by][3]=bin[bx][by][4]=0;
while(q.size())
{
Node now=q.front();
//cout<<now.x<<" "<<now.y<<" "<<now.cnt<<" "<<now.dir<<endl;
q.pop();
if(now.cnt>=ans)continue;
if(now.x==ex&&now.y==ey)
{
ans=min(ans,now.cnt);//更新答案
continue;//注意:这里不能用break
}
for(int i=1;i<=4;i++)
{
int a=dx[i]+now.x,b=dy[i]+now.y;
if(a<1||b<1||a>n||b>m)continue;
if(now.cnt>=bin[a][b][i])continue;//没必要更新了
if(Map[a][b]=='*')continue;
if(now.dir==i)
{
q.push((Node){a,b,now.cnt,i});
bin[a][b][i]=now.cnt;//更新最小值
}
else
{
if(now.dir+i==4)continue;//这是方向相反时,看不懂的回去看一下各个数字代表的方向
q.push((Node){a,b,now.cnt+1,i});
bin[a][b][i]=now.cnt+1;//更新最小值
}
}
}
}
int main()
{
m=read();n=read();
memset(bin,0x3f3f3f3f,sizeof(bin));//赋初值
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>Map[i][j];
if(Map[i][j]=='C'&&!bx&&!by)bx=i,by=j;//寻找起点
else if(Map[i][j]=='C')ex=i,ey=j;//寻找终点
}
}
BFS();
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=4;k++)cout<<bin[i][j][k]<<" ";
cout<<endl;
}
cout<<endl<<endl;
}*/
cout<<ans<<endl;
return 0;
}

洛谷 题解 P2937 【[USACO09JAN]激光电话Laserphones】的更多相关文章

  1. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  2. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  3. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  4. 洛谷 题解 UVA247 【电话圈 Calling Circles】

    [题意] 如果两个人互相打电话(直接或者间接),则说他们在同一个电话圈里.例如,\(a\)打给\(b\),\(b\)打给\(c\),\(c\)打给\(d\),\(d\)打给\(a\),则这四个人在同一 ...

  5. 洛谷 题解 P2280 【[HNOI2003]激光炸弹】

    一道很好的二维前缀和模板题. 什么是二维前缀和? 从这张图可以看出前缀和的求法: Map[i][j]=Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1]+Map[i][j]; ...

  6. 题解 洛谷 P2280 【[HNOI2003]激光炸弹】

    这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上. 经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值 ...

  7. 洛谷题解 CF777A 【Shell Game】

    同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...

  8. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...

  9. 洛谷题解 P1138 【第k小整数】

    蒟蒻发题解了 说明:此题我用的方法为桶排(我翻了翻有人用了桶排只不过很难看出来,可能有些重复的,这个题只是作为一个专门的桶排来讲解吧) (不会算抄袭吧 ‘QWaWQ’) 简单来说(会的人跳过就行): ...

随机推荐

  1. https 非对称加密

  2. [Luogu] 家族

    https://www.luogu.org/problemnew/show/1767 字符串的读入有点麻烦 #include <cstdio> #include <cstring&g ...

  3. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  4. mfc编程之发送wm_paint消息时绘图界面只出现一瞬间

    实现的功能是在打开一个文件然后把文件的图形信息绘制在picture控件上. 问题描述:我把绘制的操作放在了窗口中onpaint()函数里,打开文件后发送一个wm_paint的消息,发现picture控 ...

  5. sequence_loss的解释

    在做seq2seq的时候,经常需要使用sequence_loss这是损失函数. 现在分析一下sequence_loss这个函数到底在做什么 # coding: utf-8 import numpy a ...

  6. python输出的高亮显示

    一.语法 1.书写格式 开头部分: \033[显示方式;前景色;背景色m 结尾部分: \033[0m   例如:\033[31;1m测试的文字部分\033[0m   注意: 开头部分的三个参数:显示方 ...

  7. mac 安装docker

    下载地址: https://download.docker.com/mac/stable/Docker.dmg 从应用中找到 Docker 图标并点击运行.可能会询问 macOS 的登陆密码,输入即可 ...

  8. 2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)

    这是一场三人组队赛来的,单人带电子模板不限时单挑试一下.按照难度排序. B - Balls of Buma 题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除, ...

  9. UVALive 3716 DNA Regions ——(式子变形)

    一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...

  10. Intellij IDEA导入JAVA项目并启动(哈哈哈,天天都有人问)

    最近有很多同学,竟然不知道如何使用Intellij IDEA打开Java项目并启动 现在来讲一下,希望不要忘记了 1.打开IDEA开机页面 Maven项目 2.Maven项目是以pom文件引入各项ja ...