洛谷 题解 P2937 【[USACO09JAN]激光电话Laserphones】
看到这题,一下就想到了爆搜。(不过这题输入也是够坑的)
单纯的搜索肯定是会超时的,所以这里需要考虑一些剪枝。
我们令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】的更多相关文章
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...
- 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)
必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷 题解 UVA247 【电话圈 Calling Circles】
[题意] 如果两个人互相打电话(直接或者间接),则说他们在同一个电话圈里.例如,\(a\)打给\(b\),\(b\)打给\(c\),\(c\)打给\(d\),\(d\)打给\(a\),则这四个人在同一 ...
- 洛谷 题解 P2280 【[HNOI2003]激光炸弹】
一道很好的二维前缀和模板题. 什么是二维前缀和? 从这张图可以看出前缀和的求法: Map[i][j]=Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1]+Map[i][j]; ...
- 题解 洛谷 P2280 【[HNOI2003]激光炸弹】
这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上. 经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值 ...
- 洛谷题解 CF777A 【Shell Game】
同步题解 题目翻译(可能有童鞋没读懂题面上的翻译) 给你三张牌0,1,2. 最初选一张,然后依次进行n次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张...... 最后 ...
- 洛谷题解 CF807A 【Is it rated?】
同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...
- 洛谷题解 P1138 【第k小整数】
蒟蒻发题解了 说明:此题我用的方法为桶排(我翻了翻有人用了桶排只不过很难看出来,可能有些重复的,这个题只是作为一个专门的桶排来讲解吧) (不会算抄袭吧 ‘QWaWQ’) 简单来说(会的人跳过就行): ...
随机推荐
- sql 临时表的使用详解
Sqlserver数据库中的临时表详解 临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tem ...
- Base64().encodeBase64Chunked导致换行符的问题
String linkStr=new String(new Base64().encodeBase64Chunked(new String("conferid="+cid+&quo ...
- 04_实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M 时,发送报警邮件给root 管理员.
#!/bin/bash#提取根分区剩余空间disk_size=$(df -h / | awk '/\//{print $4}')#提取内存剩余空间disk_size=$(df -h / | awk ' ...
- http 内容协商返回最适合的内容
内容协商返回最命适的内容AcceptAccept-CharsetAccept-EncodingAccept-LanguageContent-Language内容协商技术有以下 3 种类型.服务器驱动协 ...
- 转:关于C++ const 的全面总结
转自:https://www.cnblogs.com/xkfz007/articles/2419518.html 如有侵权请联系博主,立即删除. C++中的const关键字的用法非常灵活,而使用 ...
- Ubuntu14.04 打开关闭图形桌面
使用 Ctrl+Alt+t 打开命令行界面 #关闭桌面 sudo service lightdm stop #恢复桌面 sudo service lightdm start Ctrl+Alt+F1 可 ...
- layer 漂亮的弹窗
layer.confirm('<font color="red">请认真核对账目信息,提交后将不可撤回!!</font>', { icon:3, title ...
- POJ 3342 Party at Hali-Bula ——(树型DP)
一开始用pii保存dp类型,写的很长,还是WA了= =.. 然后参考了一下别人的博客,重新写了一发(似乎是岐哥的博客233). 代码如下: #include <stdio.h> #incl ...
- eclipse使用正则表达式查找替换
1,Eclipse ctrl+f 打开查找框2,选中 Regular expressions (正则表达式) 去掉/* */(eclipse) /\*(.|[\r\n])*?\*/去掉/ ...
- linux系统rwx(421)、777权限详解
摘要 linux的常见权限,mark一下 常用的linux文件权限如下: 444 r--r--r-- 600 rw------- 644 rw-r--r-- 666 rw-rw-rw- 700 rwx ...