CodeForces 586D
题意略。
将人的移动分为3步,第一步向右,第二步是行之间的变换,第三步是向右走2步,三步加在一起算作是一次移动,计入判重数组。
在第一步时有一个特殊情况:已经越过最右边的边界线,这时graph[x][y] != '.',要进行特判。
在第二步时要注意越界和撞上火车。
在第三步时有3种情况:
1.只需走1步就可以到达边界线。此时,我需要特判。
2.走2步才能到达边界线。注意graph[x][y + 1]不能是火车。
3.不能到达边界线。注意graph[x][y + 1]和graph[x][y + 2]不能是火车。
至于为什么wa这么多次,应该是我没有考虑走路的连贯性,在棋盘上走的时候都是跳跃的。
详见代码:
#include<bits/stdc++.h>
#define maxn1 30
#define maxn2 150
using namespace std; char graph[][maxn2];
int visit[][maxn2];
int n,k,T; struct point{
int x,y;
point(int a = ,int b = ){
x = a,y = b;
}
point operator+ (point p){
return point(p.x + x,p.y + y);
}
}; bool bfs(point s){
queue<point> que;
visit[s.x][s.y] = ;
que.push(s);
while(que.size()){
point temp = que.front();
que.pop();
point nxt1 = temp + point(,);
if(nxt1.y >= n - ) return true;
if(graph[nxt1.x][nxt1.y] != '.') continue;
point nxt2;
for(int i = -;i <= ;++i){
nxt2 = nxt1 + point(i,);
if(nxt2.x < || nxt2.x > || graph[nxt2.x][nxt2.y] != '.') continue;
point nxt3 = nxt2 + point(,);
if(nxt3.y < n - && graph[nxt2.x][nxt2.y + ] == '.' && graph[nxt2.x][nxt2.y + ] == '.' && visit[nxt3.x][nxt3.y] == ){
visit[nxt3.x][nxt3.y] = ;
que.push(nxt3);
}
else if(nxt2.y + >= n - && visit[nxt3.x][nxt3.y] == ){
visit[nxt3.x][nxt3.y] = ;
que.push(nxt3);
}
else if(nxt3.y >= n - && graph[nxt2.x][nxt2.y + ] == '.' && visit[nxt3.x][nxt3.y] == ){
visit[nxt3.x][nxt3.y] = ;
que.push(nxt3);
}
}
}
return false;
} int main(){
scanf("%d",&T);
while(T--){
memset(visit,,sizeof(visit));
scanf("%d%d",&n,&k);
point start;
for(int i = ;i < ;++i){
scanf("%s",graph[i]);
if(graph[i][] == 's'){
start = point(i,);
graph[i][] = '.';
}
}
printf("%s\n",bfs(start) ? "YES" : "NO");
}
return ;
}
CodeForces 586D的更多相关文章
- Codeforces 586D. Phillip and Trains 搜索
D. Phillip and Trains time limit per test: 1 second memory limit per test :256 megabytes input: stan ...
- CodeForces - 586D Phillip and Trains 搜索。vis 剪枝。
http://codeforces.com/problemset/problem/586/D 题意:有一个3*n(n<100)的隧道.一个人在最左边,要走到最右边,每次他先向右移动一格,再上下移 ...
- 【33.33%】【codeforces 586D】Phillip and Trains
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces 586D Phillip and Trains(DP)
题目链接 Phillip and Trains 考虑相对位移. 每一轮人向右移动一格,再在竖直方向上移动0~1格,列车再向左移动两格. 这个过程相当于每一轮人向右移动一格,再在竖直方向上移动0~1格, ...
- CodeForces 586D【BFS】
题意: s是这个人开始位置:连续相同大写字母是 Each of the k trains,相应的火车具有相应的字母: '.' 代表空: 有个人在最左列,上面有连续字母代表的火车,火车从左边出去的话,会 ...
- CodeForces - 586D Phillip and Trains
这道题是一道搜索题 但是 如果没有读懂或者 或者拐过弯 就很麻烦 最多26个火车 那么每一个周期 (人走一次 车走一次) 就要更改地图 的状态 而且操作复杂 容易超时 出错 利用相对运动 计周期为 人 ...
- 【Mutual Training for Wannafly Union #1 】
A.Phillip and Trains CodeForces 586D 题意:过隧道,每次人可以先向前一格,然后向上或向下或不动,然后车都向左2格.问能否到达隧道终点. 题解:dp,一开始s所在列如 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
随机推荐
- 面试官最爱的volatile关键字
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性 ...
- ap web
apapplication端吧 应用程序端 也C-S架构Cweb网页端 般封装httpservletrequest和httpservletresponse对象处理些操作 b-s架构
- Java接口和抽象类的理解
接口和抽象类的相同之处就是 都会有抽象方法 抽象方法就是一个没有方法体 等待继承的子类完成的方法 然而接口比较严格 它的方法必须是抽象方法且是公开的 抽象类 可以有自己的属性 和 实体方法 首相用面向 ...
- 记录linux tty的一次软锁排查2
在复现tty的死锁问题的时候,文洋兄使用了如下的方式: #include <fcntl.h> #include <unistd.h> #include <stdio.h& ...
- 你不知道的Javascript:有趣的setTimeout
你不知道的Javascript:有趣的setTimeout 有时候,小小的细节往往隐藏着大大的智慧今天在回顾JavaScript进阶用法的时候,发现一个有趣的问题,话不多说,先上代码: for(var ...
- MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)
这两天在MyEclipse中开发Web项目时,连接MYSQL数据库,出现问题:Access denied for user 'root'@'localhost' (using password:YES ...
- AI_神经网络监督学习
神经网络的神奇之处在哪? 所有神经网络创造出来的价值,都是由一种机器学习,称之为监督学习, 下面这些例子神经网络效果拔群,通过深度学习获利最多的是在线广告 技术的进步来源于计算机视觉和深度学习 例如: ...
- WMS—启动过程
基于Android 6.0源码, 分析WMS的启动过程. 一. 概述 Surface:代表画布 WMS: 添加window的过程主要功能是添加Surface,管理所有的Surface布局,以及Z轴排序 ...
- 豹哥嵌入式讲堂:ARM知识概要杂辑(2)- 第一款Cortex-M处理器
1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃了以往"ARM+数字"这种处理器命名方法(ARM11之前的处理器统称经典处理器 ...
- 07_Python变量内存地址、小数据池
一.变量在内存中的地址 变量:用来标识(identify)一块内存区域.为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元.编译器负责分配.我们可以使用Python内建函数id()来获 ...