BFS:

1. 从起点开始BFS,遇到X点则return;

2. vis[px][py][0]代表经过pxpy这点前还没有找到车;

 vis[px][py][1]代表经过pxpy这点前已经找到车;

3. ip记录是否找到车;

 d表示方向

4. 最后判断时间是否超时;

5. 简单的BFS,结束!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<cmath>
#define test printf("***\n")
#define ka getchar();getchar()
#define ka1 getchar()
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
struct lp {
int x, y,d,ip,step;
friend bool operator <(const lp &a,const lp &b){
if(a.step!=b.step)return a.step>b.step;
return a.ip<b.ip;
}
} now, t;
int n, k;
char ar[N][N];
int dir[][] = {, , -, , , , , -};
bool vis[N][N][];
int bfs(int a, int b)
{
priority_queue<lp>Q;
memset(vis,,sizeof(vis));
t.x = a; t.y = b;
t.d = -;t.ip=;
t.step=;
Q.push(t);
vis[a][b][]=;
while(!Q.empty()) {
t = Q.top(); Q.pop();
for(int i = ; i < ; ++i) {
int px = t.x + dir[i][], py = dir[i][] + t.y;
if(px < || py < || px >= n || py >= n)continue;
if(ar[px][py] == 'O')continue;
if(t.step>k)return ;
if(t.ip == ) {
if(vis[px][py][])continue;
if(t.d != - && t.d != i)continue;
if(t.d != -) {
now.d = -;now.ip=;
now.x = px; now.y = py;
vis[px][py][]=;
now.step = t.step + ;
if(ar[px][py]=='X')return now.step;
if(ar[px][py]=='C'){
now.ip=;
vis[px][py][]=;
}
Q.push(now);
} else {
now.d = i;now.ip=;
now.x = t.x; now.y = t.y;
now.step = t.step + ;
Q.push(now);
}
}else{
if(vis[px][py][])continue;
now.d = i;now.ip=;
now.x = px; now.y = py;
now.step = t.step + ;
if(ar[px][py]=='X')return now.step;
vis[px][py][]=;
Q.push(now);
}
}
}
return ;
}
int main()
{
int t;
scanf("%d", &t);
while(t--) {
int a, b;
scanf("%d%d", &n, &k);
for(int i = ; i < n; ++i) {
scanf("%s", &ar[i]);
for(int j = ; j < n; ++j) {
if(ar[i][j] == 'S')a = i, b = j;
}
}
int ans = bfs(a, b);
if(ans!=&&ans<=k) {
printf("YES\n%d\n", ans);
} else {
printf("NO\n");
}
}
return ;
}
/*
3
2 3
.X
S.
2 3
.X
SC
2 4
.X
S.
*/

题目:

https://www.nowcoder.com/acm/contest/93/H

2018年东北农业大学春季校赛-wyh的吃鸡的更多相关文章

  1. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

  2. 牛客网 2018年东北农业大学春季校赛 I题 wyh的物品

    链接:https://www.nowcoder.com/acm/contest/93/I 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒空间限制:C/C++ 262144K,其他语言5242 ...

  3. 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】

    链接:https://www.nowcoder.com/acm/contest/93/K来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F( ...

  4. 2018年东北农业大学春季校赛 I wyh的物品【01分数规划/二分】

    链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...

  5. 2018年东北农业大学春季校赛 F wyh的集合【思维】

    链接:https://www.nowcoder.com/acm/contest/93/F来源:牛客网 题目描述 你们wyh学长给你n个点,让你分成2个集合,然后让你将这n个点进行两两连接在一起,连接规 ...

  6. 2018年东北农业大学春季校赛 D wyh的迷宫【搜索】

    链接:https://www.nowcoder.com/acm/contest/93/D来源:牛客网 题目描述 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 ...

  7. 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】

    链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...

  8. 2018年东北农业大学春季校赛 E wyh的集合 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/93/F 思路 其实容易知道在两个不同集合里 假设元素个数 分别为 a b 然后对于第一个集合里的每一个元素 都可以 ...

  9. 2018年东北农业大学春季校赛 E wyh的阶乘 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/93/E 思路 其实就是找阶乘的项中5的个数 末尾为什么会出现0 因为存在5的倍数和偶数相乘 有0存在 借鉴 htt ...

随机推荐

  1. session、cookie与“记住我的登录状态”的功能的实现

    Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...

  2. UWP 使用Telerik Chart控件

    Telerik开发的chart功能异常强大 用户可以自行在商店搜索"UI for uwp demos". 下面我就结合以下我的软件,来说明一下饼状图的实现. 看看效果: 先看一下X ...

  3. Qt中QComboBox中自定义界面使用stylesheet实现下拉按钮独立效果

    使用QSS自定义控件界面时,QT中控件QCombobox含有两个子控件drop-down和down-arrow.一般而言,当改变QCombox时,很多效果都会出来,但是,针对下拉按钮和下拉图标的自定义 ...

  4. 在使用document.getElementById('xxx').files[0]时,关于计算图片大小

    在使用文件上传属性时,一直好奇图片上传的大小时如何计算的,最近在使用中认识到的计算方式:  首先,图片大小的存储基本单位是字节(byte).每个字节是由8个比特(bit)组成.所以,一个字节在十进制中 ...

  5. Gitlab - Pull Request

    1.概述 今天查看Gmail,有网友私密我Gitlab的Pull Request工作流程,一直以为我写过这片博客,查看<Git和Gitlab协同工作>却发现遗漏了Pull Request这 ...

  6. 【Python】 文件和操作文件方法

    文件 ■ 基本的文件用法 f = open("path","mode") mode有a,w,r,b,+等.默认为r.模式与打开文件时的动作有关系,比如用w打开的 ...

  7. 浅谈new/delete和malloc/free的用法与区别

    每个程序在执行时都会占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为自由存储区或堆. 一.new和delete用法 如下几行代码: int *pi=new int; int *pi=ne ...

  8. 玩转接口测试工具fiddler 教程系列1

    我们在做web测试的时候,很多时候需要查看接口发送的数据返回的数据是否正常,这样可以排除是客户端的问题还是服务器的问题,举个例子来说,如果我们发现页面上面数据少了, 通过fiddler查看数据返回就少 ...

  9. Django学习(六)---博客文章页面的超链接设置

    Django中的超链接 超链接的目标地址 href后面是目标地址 template中可以用 {% url  'app_name : url_name'   param %} app_name:应用命名 ...

  10. Java基础学习(二)

    软件设计原则: 为了提高软件的开发效率,降低软件开发成本,一个优良的软件系统应该具有以下特点: 1,可重用性:遵循DRY原则,减少软件中的重复代码. 2,可拓展性:当软件需要升级增加新的功能,能够在现 ...