2018年东北农业大学春季校赛-wyh的吃鸡

Cwolf9 2018-04-05 原文

2018年东北农业大学春季校赛-wyh的吃鸡

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 = 110;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
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[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
bool vis[N][N][10];
int bfs(int a, int b)
{
    priority_queue<lp>Q;
    memset(vis,0,sizeof(vis));
    t.x = a; t.y = b;
    t.d = -1;t.ip=0;
    t.step=0;
    Q.push(t);
    vis[a][b][0]=1;
    while(!Q.empty()) {
        t = Q.top(); Q.pop();
        for(int i = 0; i < 4; ++i) {
            int px = t.x + dir[i][0], py = dir[i][1] + t.y;
            if(px < 0 || py < 0 || px >= n || py >= n)continue;
            if(ar[px][py] == 'O')continue;
            if(t.step>k)return 0;
            if(t.ip == 0) {
                if(vis[px][py][0])continue;
                if(t.d != -1 && t.d != i)continue;
                if(t.d != -1) {
                    now.d = -1;now.ip=0;
                    now.x = px; now.y = py;
                    vis[px][py][0]=1;
                    now.step = t.step + 1;
                    if(ar[px][py]=='X')return now.step;
                    if(ar[px][py]=='C'){
                        now.ip=1;
                        vis[px][py][1]=1;
                    }
                    Q.push(now);
                } else {
                    now.d = i;now.ip=0;
                    now.x = t.x; now.y = t.y;
                    now.step = t.step + 1;
                    Q.push(now);
                }
            }else{
                if(vis[px][py][1])continue;
                now.d = i;now.ip=1;
                now.x = px; now.y = py;
                now.step = t.step + 1;
                if(ar[px][py]=='X')return now.step;
                vis[px][py][1]=1;
                Q.push(now);
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--) {
        int a, b;
        scanf("%d%d", &n, &k);
        for(int i = 0; i < n; ++i) {
            scanf("%s", &ar[i]);
            for(int j = 0; j < n; ++j) {
                if(ar[i][j] == 'S')a = i, b = j;
            }
        }
        int ans = bfs(a, b);
        if(ans!=0&&ans<=k) {
            printf("YES\n%d\n", ans);
        } else {
            printf("NO\n");
        }
    }
    return 0;
}
/*
3
2 3
.X
S.
2 3
.X
SC
2 4
.X
S.
*/

View Code

 

posted on 2018-04-05 21:12 日常膜大佬~太强了 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为Cwolf9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Cwolf9/p/8724309.html

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

  1. 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)

    图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大 […]...

  2. 【leet-code】542. 01 矩阵

    题目描述 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 […]...

  3. POJ3126 Prime Path

    题目链接:https://vjudge.net/problem/POJ-3126Description The […]...

  4. 算法与数据结构基础 – 广度优先搜索(BFS)

    算法与数据结构基础 – 广度优先搜索(BFS) 2019-07-28 16:43 by bange […]...

  5. 队列的概念

    队列的概念 队列,和栈一样,也是一种对数据的”存”和”取”有严 […]...

  6. HDU1241 Oil Deposits

    题目链接:https://vjudge.net/problem/HDU-1241Description The […]...

  7. 回顾二分与bfs(或者说是递推)和简单模拟

    今天,阳光正好,适合敲代码,诸事皆宜。 先来两道简单的模拟题。 第一道 机器翻译 输出为5. 代码思路:很明显 […]...

  8. POJ3278 Catch That Cow

    题目链接:https://vjudge.net/problem/POJ-3278Description Far […]...

随机推荐

  1. Terraform状态State管理,让变更有记录

    Terraform状态State管理,让变更有记录 我最新最全的文章都在 南瓜慢说 www.pkslow.co […]...

  2. K-means之matlab实现

    引入 作为练手,不妨用matlab实现K-means 要解决的问题:n个D维数据进行聚类(无监督),找到合适的 […]...

  3. 允许远程桌面连接 服务器群控

    批量远程桌面上软件 服务器群控 远程桌面是微软公司为了便于网络管理员管理维护服务器推出的一项服务。从windo […]...

  4. 项目实战——企业级Zabbix监控实战(一)

    项目实战——企业级Zabbix监控实战 实验一:Zabbix监控的搭建 1、实验准备   centos系统服务 […]...

  5. easyPoi 工具类

    import cn.afterturn.easypoi.excel.ExcelExportUtil; impo […]...

  6. 12、如何在Windows 2000下将Oracle完全卸载? – Sanle

    12、如何在Windows 2000下将Oracle完全卸载? 12、如何在Windows 2000下将Ora […]...

  7. NI LabView 学习第一天 – wangzefeng

    NI LabView 学习第一天 参考资料网址:http://www.ni.com/getting-start […]...

  8. 最简单的CUDA安装方式

    Linux下一行apt-get指令: # sudo apt install nvidia-cuda-toolk […]...

展开目录

目录导航