[noip模拟]难缠的值周生<宽搜>
难缠的值周生
【问题描述】
小 P 上学总是迟到,迟到了以后常常会被值周生发现。被值周生发现就会给
他所在的班级扣分,被扣了分不免要挨班主任的训,这令小 P 很不爽。不过,聪
明的他经过观察发现,值周生通常会站在固定的位置,并且他们都很笨,只会向
固定的同一个方向看。于是小 P 经过潜心研究,把值周生的站位和方向以及学校
的地形绘成一张地图,你的任务是编写一个程序,帮助小 P 找出一条路从大门到
达教室并且不被值周生发现。
【输入文件】
输入文件的第一行是两个整数 N,G,代表学校是一个N × N的正方形,其
中有 G 个值周生。
接下来输入一个 N × N 的矩阵,代表学校。其中.代表空地,X(大写英文字
母)代表墙,E 代表学校的大门,小 P 将从这里进入学校,C 代表教室,小 P 到
达这里就胜利了。数字代表值周生,数字的值代表值周生的编号,显然值周生不
能穿墙透视,但是小 P 也不能翻墙或者站到墙上去。
接下来有 G 行,每行包含一个数字Gi 和一个字母,代表第 Gi 个值周生的朝
向。其中 N 表示北,S 表示南,E 表示东,W 表示西。显然,如果你撞上值周
生(走到值周生所在的格子上),也会被值周生发现。
【输出文件】
输出文件包含任意一个行走方案,每行一个字母,表示小P 每步走的方向。
如果无论小P 怎么走都不能不被值周生发现的走到教室,则输出一行整数-1。
【样例输入】
5 3
..E.1
...XX
.2.X.
.C.X.
...X3
1 E
2 E
3 W
没错这样一道题确实是冬令营的题,没错而且方法就是你第一眼看出的bfs
但是,但是,我还是错了很久,然而,当我拿到数据的时候,千言万语汇成一句话:吔屎了出题人
首先我们看一个史上最短的AC代码
#include<cstdio>
int main(){
freopen("guard.in","r",stdin);
freopen("guard.out","w",stdout);
puts("-1");}
没错所有数据的答案是-1,所以就算你bfs再精妙,只要你忘记输出-1,那就GG
然后更有趣的地方来了
我来展示一波数据3
10 2
....G.....
2.........
..........
..1.......
..........
....C.....
..........
..........
..........
..........
1 N
2 E
看出什么没,看出什么没????没错,题干所说的E不见了,好神奇是不是,所以你的程序就会一直少读入一个或者找错起点,是不是很神奇
所以吔屎了出题人QAQ
-------------------------------------------------------------------
好了正经点讲一讲题解,这题的做法就是BFS,特殊处理就是不要用STL的队列,手写一个队列记录一个前驱,另外就是处理视线重合和围墙两种不同的情况
然后就没了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstdlib>
#include<cmath>
#define maxn 40
using namespace std; struct node{
int x,y,pre;
};//d:0=N 1=S 2=W 3=E
const int dx[]={-,,,},dy[]={,,-,};
int n,m,sx,sy,fx,fy,g,tot;
int map[maxn][maxn],gx[maxn],gy[maxn],ans[maxn];
node q[]; int read(){
int xx=,ff=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')ff=-;ch=getchar();}
while(ch>=''&&ch<=''){xx=xx*+ch-'';ch=getchar();}
return xx*ff;
} int check(int x,int y){
if(x<||x>n||y<||y>n)return false;
return true;
} void del(int num,int dir){
int nx=gx[num],ny=gy[num];
while(check(nx,ny)){
map[nx][ny]=;
nx+=dx[dir];ny+=dy[dir];
if(map[nx][ny]==)break;
}
} void fre(){
freopen("guard.in","r",stdin);
freopen("guard.out","w",stdout);
} void init(){
n=read();g=read();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
char ch=getchar();int gg;
while(ch!='G'&&ch!='E'&&ch!='.'&&ch!='C'&&(ch<''||ch>'')&&ch!='X')ch=getchar();
if(ch=='.')continue;
if(ch=='X')map[i][j]=;
if(ch=='C')fx=i,fy=j;
if(ch=='E'||ch=='G')sx=i,sy=j;
if(ch>=''&&ch<=''){
gg=ch-'';gx[gg]=i;gy[gg]=j;
}
}
}
for(int i=;i<=g;i++){
int gg;char ch;
gg=read();ch=getchar();
while(ch!='N'&&ch!='W'&&ch!='S'&&ch!='E')ch=getchar();
if(ch=='N'){del(gg,);}
if(ch=='S'){del(gg,);}
if(ch=='W'){del(gg,);}
if(ch=='E'){del(gg,);}
}
} void print(int r){
while(q[r].pre){
int l=q[r].pre;
if(q[r].x==q[l].x){
if(q[r].y>q[l].y)
ans[++tot]='E';
else ans[++tot]='W';
}else{
if(q[r].x<q[l].x)
ans[++tot]='N';
else ans[++tot]='S';
}r=l;
}
for(int i=tot;i>=;i--){
printf("%c\n",ans[i]);
}
} void bfs(int ssx,int ssy){
q[]=(node){ssx,ssy,};
int l=,r=;r++;
while(l<r){
l++;
node u=q[l];
map[u.x][u.y]=;
if(u.x==fx&&u.y==fy){
print(l);return;
}
for(int i=;i<=;i++){
int nx=u.x+dx[i];
int ny=u.y+dy[i];
if(!check(nx,ny))continue;
if(map[nx][ny]==){
map[nx][ny]=;
r++;q[r]=(node){nx,ny,l};
if(nx==fx&&ny==fy){
print(r);return;
}
}
}
}
puts("-1");
} int main(){
fre();
init();
if(map[sx][sy]==){puts("-1");return ;}
bfs(sx,sy);
}
我的代码有些步骤可能是多余的,因为之前我显示的是超时,所以我把所有可能降低一丢时间复杂度的地方都魔改了,所以不要在意细节了
[noip模拟]难缠的值周生<宽搜>的更多相关文章
- NOIP模拟测试20「周·任·飞」
liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...
- NOIP模拟 17.8.16
NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们 ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
随机推荐
- [红日安全]Web安全Day8 - XXE实战攻防
本文由红日安全成员: ruanruan 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了 ...
- SPA那点事
前端猿一天不学习就没饭吃了,后端猿三天不学习仍旧有白米饭摆于桌前.IT行业的快速发展一直在推动着前端技术栈在不断地更新换代,前端的发展成了互联网时代的一个缩影.而单页面应用的发展给前端猿分了一杯羹. ...
- excel排序技术记录
问题: 给了我一个excel,要求以奖项和编码同时进行排序(奖项优先),但是单元格大小不一样,有数列都是合并了单元格的,同时编码的格式还不一样,有些是SMM-2-07,有些是2-07,所以根本无法进行 ...
- Node的require和module.exports
node编程中最重要的思想之一就是模块,在 Node.js 模块系统中,每个文件都被视为独立的模块.这是这个思想,让javascript的大规模工程成为可能.模块化编程在前端大肆盛行,在node中导出 ...
- java中的while循环和do while循环
那么在讲解循环之前呢我们先来了解一下什么是循环 生活中的例子 车子的轮胎他就是一直在循环 马拉松跑到也是在循环 因为运动员不停的一圈一圈在跑这也是一个循环 那么我们为什么要学习循环呢? 下面看一个 ...
- Nginx之负载均衡配置(一)
前文我们聊了下nginx作为反向代理服务器,代理后端动态应用服务器的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12430543.html:今天我们来聊 ...
- 网页中三角型的CSS实现
我们在使用CSS框架的时候,经常会用到下拉框组件,一般该组件里面有个下三角.很多网上用到三角形,如图所示,这个三角形是如何实现的呢? 1.使用CSS可以实现,先来复习一CSS盒子模型相关知识.给出如下 ...
- 使用vue-router+vuex进行导航守卫(转)
前言:想要实现登录后才能进入主页等其他页面,不然都会跳转到登录页.但是Vuex有个不够完美的地方,一旦刷新页面就会没了,所以还要用到localStorage. 一.router.js: import ...
- ajax js分页算法分析
显示效果:[页面总数小于等于10,全部显示,当前页特殊显示]上一页 1 2 3 4 5 6 7 8 9 10 下一页 [页面总数大于10,部分显示,当前页特殊 ...
- 基于 HTML5 WebGL 与 GIS 的智慧机场大数据可视化分析
前言:大数据,人工智能,工业物联网,5G 已经或者正在潜移默化地改变着我们的生活.在信息技术快速发展的时代,谁能抓住数据的核心,利用有效的方法对数据做数据挖掘和数据分析,从数据中发现趋势,谁就能做到精 ...