牛客多校第二场 I.Penguins
题意
两个企鹅,一个从地图的右下角走右上角,一个从另一个地图的左下角走到左上角,我们操控左边的企鹅,右边的企鹅与左边企鹅运动规则如下。
- 左边企鹅向左,右边企鹅向右
 - 左边企鹅向右,右边企鹅向左
 - 左边企鹅向上,右边企鹅向上
 - 左边企鹅向下,右边企鹅向下
与此同时,如果左右企鹅遇到了障碍,或者遇到了越界情况,那么这一步就作废。
求最小步数,并且给出字典序最小的方向变化,以及用\('A'\)来体现运动路径。 
解题:
说实话真的没见过\(bfs\)还能这样玩的,假设只有一只企鹅那么设状态就\(d[x][y]\),那么两只企鹅就是\(d[x1][y1][x2][y2]\)就好了呀,剩下的就是正常的\(bfs\)过程,对于队列的类型我是用的结构体,看北大大佬的代码使用的元组类型,至于记录路径以及方向,那么就是老套路了,用g数组记录就行。
细节:
- 要求输出方向字典序最小,那么就是轮询的方向就是下、左、右、上了。
 - 对于切换方向,如果1异或3等于2,2异或3等于1,很巧妙。
 - 处理输入,题目直接给了这样一个输入,两个地图用空格隔开,我可能直接用字符数组一次性保存两个了,处理起来肯定贼麻烦。

但是可以这样,直接保存两个地图。

 
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 20;
#define x first
#define y second
string a[N], b[N];
int d[N][N][N][N];
int dx[4] = {1, 0, 0, -1}, dy[4] = {0, -1, 1, 0};
struct node {
    int x1, y1, x2, y2, i;
}rem[N][N][N][N];
int another(int i) {
    if (i == 1 || i == 2) return i ^ 3;
    else return i;
}
PII move(string g[], int x, int y, int i) {
    int xx = x + dx[i], yy = y + dy[i];
    if (xx < 0 || xx >= N || yy < 0 || yy >= N || g[xx][yy] == '#') return {x, y};
    return {xx, yy};
}
void bfs() {
    memset(d, -1, sizeof d);
    queue<node> q;
    q.push({N - 1, N - 1, N - 1, 0});
    d[N - 1][N - 1][N - 1][0] = 0;
    while (q.size()) {
        auto t = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            PII leftP = move(a, t.x1, t.y1, i);
            PII rightP = move(b, t.x2, t.y2, another(i));
            if (d[leftP.x][leftP.y][rightP.x][rightP.y] == -1) {
                d[leftP.x][leftP.y][rightP.x][rightP.y] = d[t.x1][t.y1][t.x2][t.y2] + 1;
                rem[leftP.x][leftP.y][rightP.x][rightP.y] = {t.x1, t.y1, t.x2, t.y2, i};
                q.push({leftP.x, leftP.y, rightP.x, rightP.y});
            }
        }
    }
}
int main() {
    string a[N], b[N];
    for (int i = 0; i < N; i++) cin >> a[i] >> b[i];
    bfs();
    cout << d[0][N - 1][0][0] << endl;
    int ex1 = 0, ey1 = N - 1, ex2 = 0, ey2 = 0;
    string res = "";
    while (true) {
        a[ex1][ey1] = b[ex2][ey2] = 'A';
        if (ex1 == N - 1 && ey1 == N - 1 && ex2 == N - 1 && ey2 == 0) break;
        auto t = rem[ex1][ey1][ex2][ey2];
        int x1 = t.x1, y1 = t.y1, x2 = t.x2, y2 = t.y2, i = t.i;
        string dir = "DLRU";
        res += dir[i];
        ex1 = x1, ey1 = y1, ex2 = x2, ey2 = y2;
    }
    reverse(res.begin(), res.end());
    cout << res << endl;
    for (int i = 0; i < N; i++) {
        cout << a[i] << " " << b[i] << endl;
    }
    return 0;
}
												
											牛客多校第二场 I.Penguins的更多相关文章
- 2019牛客多校第二场 A  Eddy Walker(概率推公式)
		
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
 - 牛客多校第二场A   run(基础DP)
		
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
 - run (牛客多校第二场)计数DP
		
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 题目描述 White Cloud is exercising in the playground ...
 - 2019牛客多校第二场H-Second Large Rectangle
		
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...
 - 2019年牛客多校第二场 H题Second Large Rectangle
		
题目链接 传送门 题意 求在\(n\times m\)的\(01\)子矩阵中找出面积第二大的内部全是\(1\)的子矩阵的面积大小. 思路 处理出每个位置往左连续有多少个\(1\),然后对每一列跑单调栈 ...
 - [2019牛客多校第二场][G. Polygons]
		
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
 - 第二大矩阵面积--(stack)牛客多校第二场--	Second Large Rectangle
		
题意: 给你一幅图,问你第二大矩形面积是多少. 思路: 直接一行行跑stack求最大矩阵面积的经典算法,不断更新第二大矩形面积,注意第二大矩形可能在第一大矩形里面. #define IOS ios_b ...
 - 2019 牛客多校第二场 H Second Large Rectangle
		
题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...
 - 2019牛客多校第二场H题(悬线法)
		
把以前的题补补,用悬线求面积第二大的子矩形.我们先求出最大子矩阵的面积,并记录其行三个方向上的悬线长度.然后排除这个矩形,记得还得特判少一行或者少一列的情况 #include <bits/std ...
 - 牛客多校第二场H Second Large Rectangle  单调栈or悬线法
		
Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一 ...
 
随机推荐
- 升讯威在线客服系统是如何实现对 IE8 完全完美支持的(怎样从 WebSocket 降级到 Http)【干货】
			
简介 升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放.开源.共享.努力打造 .net 社区的一款优秀开源产品. 完整私有化包下载地址 https ...
 - 2021-7-12 VUE的生命周期
			
挂载: beforeCreate created beforeMount mounted:el挂载到实例上时运行 更新: beforeUpdate updated 销毁: beforeDestory ...
 - 【go语言】2.3.2 error 接口
			
在 Go 语言中,error 是一个内置的接口类型,用于表示错误情况.error 接口的定义如下: type error interface { Error() string } 任何具有 Error ...
 - C#/.NET/.NET Core优秀项目和框架每周精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
			
前言 注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯). 每周精选优秀的C#/.NET/.NET Core项目和框架,帮助 ...
 - ctfshow--web入门--XXE
			
ctfshow--web入门--XXE web373 源码 <?php error_reporting(0); libxml_disable_entity_loader(false); //允许 ...
 - 推荐几款三维模型OBJ格式轻量化处理工具软件
			
推荐几款三维模型OBJ格式轻量化处理工具软件 以下是几款常用的三维模型OBJ格式轻量化处理软件的介绍: 1.MeshLab: MeshLab是一款免费且强大的开源三维模型处理软件,支持多种文件格式,包 ...
 - Set Concept
			
集合(Set)就是一种用来装事物的容器(或者称为结构),它所装的东西叫元素.集合这个容器的逻辑性很强,可以说是现在比较严谨的工具. 集合里的元素,它们可以是任何类型的数学对象:数字.符号.变量.空间中 ...
 - QA|不同模块之间的引用(导入问题)问题;|Pycharm
			
结构如图,在xxu的test.py中想要导入t2包中的sayhello和word两个方法 注意:首先需要打开xxu和t2的上层目录,因为解释器是从打开的那个文件开始查找的,所以这里应该打开B01_01 ...
 - centos8环境基本优化
			
centos8环境基本优化 目录 centos8环境基本优化 1.防火墙优化 2.源优化: 方案1.更换阿里源 方案2.使用centos8.5 源 安装epel源 3.ssh连接慢解决 4.关闭公网, ...
 - Skynet:Debug Console的扩展
			
起因 最近上线服务器遇到了一些问题,上个月CPU暴涨的问题,那个经查验是死循环导致endless loop了. 这周又遇到了mem占用达到96%的问题,在debug console里调用了gc之后,跌 ...