2020ICPC 南京 Evil Coordinate(模拟,构造)

2024-04-15 23:18

本文主要是介绍2020ICPC 南京 Evil Coordinate(模拟,构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

最后是队友过的,我写的相对复杂
题意:
给一个移动的序列(L,R,U,D代表左右上下),
重排其使得移动的过程不会经过 ( X , Y ) (X,Y) (X,Y)
设终点为 ( e x , e y ) (ex,ey) (ex,ey)
思路:
首先特判掉特殊点为终点或者为原点的情况,
分为两种情况:

  • 特殊点不在坐标轴上,此时如果 e x = X ex=X ex=X,那么先用 L , R L,R L,R使其只剩下一个,然后用光U,D,再使用剩下的L,R。如果 e x ! = X ex!=X ex!=X,那么先用 L , R L,R L,R,再用 U , D U,D U,D
  • 特殊点在坐标轴上,仅考虑在X轴上的情况,Y轴上的情况类似考虑。
    • 如果只存在 L , R L,R L,R,那么如果有这个条件则无解:(abs(ex) >= abs(X) && ((ex > 0 && X > 0) || (ex < 0 && X < 0)))。否则如果 L > R L>R L>R,则按照 L R L R L R . . L L L LRLRLR..LLL LRLRLR..LLL的方式输出,如果 R > L R>L R>L则按照 R L R L R L R L . . . R R R RLRLRLRL...RRR RLRLRLRL...RRR的方式输出。如果 L = R L=R L=R,则如果 X < 0 X<0 X<0,则按照 R L R L R L . . . RLRLRL... RLRLRL...输出,否则按照 L R L R L R LRLRLR LRLRLR的方式输出。
    • 如果只存在 U , D U,D U,D,则直接输出 U , D U,D U,D
    • 如果同时存在 L , R L,R L,R U , D U,D U,D,那么当 U ! = D U!=D U!=D的时候全部输出,否则输出到 U , D U,D U,D剩下一个,再输出 L , R L,R L,R,最后输出剩下的那个 U , D U,D U,D
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <assert.h>using namespace std;
const int maxn = 1e6+10;
char s[maxn];
int L,R,U,D;
int ex,ey;
int X,Y;
int all;
int rx,ry;
void Print(char x,int cnt) {for(int i = 1;i <= cnt;i++) {printf("%c",x);}
}void PrintAll() {Print('L',L);Print('R',R);Print('U',U);Print('D',D);
}void PrintSwap(char x,char y,int cnt) {for(int i = 1;i <= cnt;i++) {printf("%c%c",x,y);}
}void solve1() {if(X) {if(all == 1) {if(L || R) {if(abs(ex) >= abs(X) && ((ex > 0 && X > 0) || (ex < 0 && X < 0))) {printf("Impossible");} else if(L < R) {PrintSwap('R','L',L);Print('R',R - L);} else if(L > R) {PrintSwap('L','R',R);Print('L',L - R);} else if(L == R) {if(X < 0) {PrintSwap('R','L',L);} else {PrintSwap('L','R',L);}}} else if(U || D) {PrintAll();}} else {int flag = 0;if(U != D) {Print('U',U);Print('D',D);} else {Print('U',U - 1);Print('D',D);flag = 1;}Print('L',L);Print('R',R);if(flag) {Print('U',1);}}} else if(Y) {if(all == 1) {if(L || R) {PrintAll();} else if(U || D) {if(abs(ey) >= abs(Y) && ((ey > 0 && Y > 0) || (ey < 0 && Y < 0))) {printf("Impossible");} else if(U < D) {PrintSwap('D','U',U);Print('D',D - U);} else if(U > D) {PrintSwap('U','D',D);Print('U',U - D);} else if(U == D) {if(Y < 0) {PrintSwap('U','D',U);} else {PrintSwap('D','U',U);}}}} else {int flag = 0;if(L != R) {Print('L',L);Print('R',R);} else {Print('L',L - 1);Print('R',R);flag = 1;}Print('U',U);Print('D',D);if(flag) {Print('L',1);}}}
}void solve2() {if(ex == X) {if(X > 0) {Print('L',L);Print('R',R - 1);Print('U',U);Print('D',D);Print('R',1);} else if(X < 0) {Print('L',L - 1);Print('R',R);Print('U',U);Print('D',D);Print('L',1);}} else {Print('L',L);Print('R',R);Print('U',U);Print('D',D);}
}int main() {int T;scanf("%d",&T);while(T--) {scanf("%d%d",&X,&Y);rx = 0,ry = 0;scanf("%s",s + 1);int n = strlen(s + 1);L = 0,R = 0,U = 0,D = 0;ex = 0,ey = 0;for(int i = 1;i <= n;i++) {if(s[i] == 'L') {L++;ex--;} else if(s[i] == 'R') {R++;ex++;} else if(s[i] == 'U') {U++;ey++;} else if(s[i] == 'D') {D++;ey--;}}all = (L || R) + (U || D);//        printf("DEBUG: %d\n",all);if(X == 0 && Y == 0) {printf("Impossible");} else if(ex == X && ey == Y) {printf("Impossible");} else if(X == 0 || Y == 0) { //如果特殊点在坐标轴上solve1();} else {solve2();}printf("\n");}
}

这篇关于2020ICPC 南京 Evil Coordinate(模拟,构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907208

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

(南京观海微电子)——GH7006 Application Note

Features ⚫ Single chip solution for a WXGA α-Si type LCD display ⚫ Integrate 1200 channel source driver and timing controller ⚫ Display Resolution: ◼ 800 RGB x 480 ◼ 640 RGB x 480 ⚫ Display int