题目链接: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. [转帖]插曲:大白话带你认识Kafka

    插曲:大白话带你认识Kafka 2019-11-18 21:58:27 从事Java 阅读数 2更多 分类专栏: java Kafaka   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  2. vue报错[Vue warn]: Unknown custom element: <router-Link> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

    vue浏览器报错,如下 vue.runtime.esm.js?2b0e:619 [Vue warn]: Unknown custom element: <router-Link> - di ...

  3. java之mybatis之缓存

    1.mybatis自带缓存功能.分为一级缓存,二级缓存. 2.一级缓存为 session 缓存,在一个 session中 ,一个查询的 select 语句只会执行一次,根据  <select&g ...

  4. 如何让 height:100%; 起作用---父级元素必须设定高度

    参考: http://www.webhek.com/post/css-100-percent-height.html https://www.cnblogs.com/kunmomo/p/1060066 ...

  5. 解决SqlDataSource连接超时的问题

    采用两种策略: 1.连接字符串增加Connect Timeout=1000(大约1000秒/60=16分钟) 2.设置SqlDataSourced 的 EnableCaching="True ...

  6. 记录一次git回滚代码

    老大临时让更新一版代码到本地,熟练的git fetch/git merge 之后,出来了一批改动的文件,但是并不是我改动的. 我以为是版本迭代出来的其他同事改的,我就直接给add commit到我的版 ...

  7. MySQL Replication--多线程复制MTS

    多线程复制 多线程复制MTS(Mult-Threaded Slave Applier)指使用多个线程来并发应用二进制日志.在MYSQL5.6版本中,多线程复制基于schema来实现,将多个数据库下的事 ...

  8. 构建nodejs环境

    总想留下点东西,不负年华! 00.download releasehttps://nodejs.org/dist/      //all release example https://nodejs. ...

  9. Spring 重定向(Redirect)指南

    原文:Hacking the IntegerCache in Java 9? 链接:https://dzone.com/articles/hacking-the-integercache-in-jav ...

  10. AM335X有关MMC的启动参数问题分析

    AM335X有关MMC的启动参数问题分析 一. 问题来源 硬件平台:AM335X芯片 SDK版本:ti-processor-sdk-linux-am335x-evm-03.00.00.04-Linux ...