题目链接:https://codeforc.es/gym/101981/attachments

题意:在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过5e4步的情况下能否把全部袋鼠聚集在同一个位置。

题解:先预处理每个袋鼠到其他袋鼠的初始方向,然后每次选两个不同的袋鼠,其中一个向另一个逼近,直到聚集在一起,然后重复该操作。因为n,m <= 20,所以最多只有400个袋鼠,而每两个不同的袋鼠逼近的过程中最多走 80 步,故操作次数上界是 3.2e4。

 #include <bits/stdc++.h>
#define sd(a) scanf("%d",&a)
#define sld(a) scanf("%lld",&a)
#define mst(a,b) memset(a,b,sizeof a)
#define mp make_pair
#define all(a) a.begin(),a.end()
typedef long long ll;
#define pb push_back
using namespace std;
typedef pair<int, int> pii;
const int maxn = 2e6 + ;
const int maxm = 1e6 + ;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + ;
const double eps = 1e-;
char s[][];
int to[][][][];
bool vis[][];
vector<pii>v;
int n, m; bool judge(int x, int y) {
return <= x && x <= n && <= y && y <= m && s[x][y] == '';
} int dx[] = {, , -, }, dy[] = {, , , -};
void pre(int x, int y) {
mst(vis, );
vis[x][y] = ;
vector<pii>v;
queue<pii>q;
for(int i = ; i < ; ++i) {
v.clear();
int nx = x + dx[i], ny = y + dy[i];
if(!judge(nx, ny))
continue;
q.push(mp(nx, ny));
for(; !q.empty();) {
pii p = q.front();
q.pop();
int ux = p.first;
int uy = p.second;
if(vis[ux][uy])
continue;
vis[ux][uy] = ;
v.pb(p);
for(int j = ; j < ; ++j) {
int qx = dx[j] + ux, qy = dy[j] + uy;
if(judge(qx, qy) && !vis[qx][qy])
q.push(mp(qx, qy));
}
}
int sz = v.size();
for(int j = ; j < sz; ++j) {
int qx = v[j].first;
int qy = v[j].second;
to[x][y][qx][qy] = i;
}
}
} int main() {
#ifdef LOCAL
freopen("in", "r", stdin);
#endif // local
// int n,m;
sd(n), sd(m);
for(int i = ; i <= n; ++i)
scanf("%s", s[i] + );
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) {
if(s[i][j] - '')
v.pb(mp(i, j));
pre(i, j);
}
vector<int>q;
int sz = v.size();
char ch[] = {'D', 'R', 'U', 'L'};
for(;;) {
int idx1 = , idx2 = -;
for(int i = ; i < sz; ++i) {
if(v[i] != v[idx1]) {
idx2 = i;
break;
}
}
if(idx2 == -)
break;
for(; v[idx1] != v[idx2];) {
int x1 = v[idx1].first, x2 = v[idx2].first;
int y1 = v[idx1].second, y2 = v[idx2].second;
int id = to[x1][y1][x2][y2];
q.pb(id);
for(int i = ; i < sz; ++i) {
if(judge(v[i].first + dx[id], v[i].second + dy[id]))
v[i].first += dx[id], v[i].second += dy[id];
}
}
}
for(int i = , z = q.size(); i < z; ++i) {
int id = q[i];
putchar(ch[id]);
}
return ;
}

ACM-ICPC 2018 南京赛区现场赛 K. Kangaroo Puzzle (思维+构造)的更多相关文章

  1. ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...

  2. ACM-ICPC 2018 南京赛区现场赛 E. Eva and Euro coins (思维)

    题目链接:https://codeforc.es/gym/101981/attachments 题意:给出两个只包含01的字符串,每次可以选择连续k个相同的数字进行翻转,问能否通过若干次操作把两个字符 ...

  3. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)

    题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...

  4. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  5. 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4803 Problem Description Jenny is a warehouse keeper. ...

  6. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  7. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  8. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  9. ACM总结——2017ACM-ICPC北京赛区现场赛总结

    现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...

随机推荐

  1. UV数据与风速风向数据转换

    package com.qr.util; import java.text.DecimalFormat; /** * //TODO UV数据与风速风向数据转换 */ public class UVAn ...

  2. xe.10.2的下载路径

    为了这个玩意,我折腾了一天,为了以后自己还用到 官网地址: http://altd.embarcadero.com/download/radstudio/10.2/delphicbuilder10_2 ...

  3. 通过excel表格分析学生成绩

    题目要求: 分析文件’课程成绩.xlsx’,至少要完成内容:分析1)每年不同班级平均成绩情况.2)不同年份总体平均成绩情况.3)不同性别学生成绩情况,并分别用合适的图表展示出三个内容的分析结果. 废话 ...

  4. 基于STM32F767两路互补SPWM波(HAL库)

    SPWM波指的是占空比呈正弦规律变化的PWM波,生成方式是在定时器中断中调整PWM波的占空比. 对于互补的两路SPWM波,一路为低电平 ‘0’ 时,另一路为高电平 ‘1’,即两路是互补的. 对于STM ...

  5. MVC路由规则

    1 可以创建多条路由规则,每条路由规则的那么属性不同 2路由规则是有顺序的.如果被前面的规则匹配了,那么后面的规则就没机会了 3 constraints 约束: 4namespaces 命名空间 5r ...

  6. sql server 压缩日志文件

    USE [master] GO ALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE TestDB SET ...

  7. linux端口映射

    参考文章: http://jingyan.baidu.com/article/ed15cb1b2a332e1be36981ed.html http://www.myhack58.com/Article ...

  8. Ambari深入学习(III)-开源使用及其改进思考

    Ambari采用的不是一个新的思想和架构,也不是完成了软件的新的革命,而是充分利用了一些已有的优秀开源软件,巧妙地把它们结合起来,使其在分布式环境中做到了集群式服务管理能力.监控能力.展示能力.这些优 ...

  9. System.Web.NullPointerException

    在.Net异步webApi中我们需要记录日志信息,需要获取客户端的ip地址,我们需要使用:HttpContext.Current.Request.ServerVariables["REMOT ...

  10. js获取对象的属性个数

    for (var i = 0; i < dt.length; i++) { if (Object.keys(dt[i]).length <= 1) { dt.splice(i, 1); i ...