2021 ICPC 沈阳赛区J题 Luggage Lock

题意

有TTT组样例,其中每组样例为:
给定一个密码为b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​的密码锁,已知当前密码锁的状态为a0a1a2a3a_0a_1a_2a_3a0​a1​a2​a3​,求解开密码的最小步数。
b,a∈[0,9]b,a\in [0,9]b,a∈[0,9]。

每一步可以操作任意一个连续的区间[l,r][l,r][l,r],使得这个区间的数字都向上拨动一位或者向下拨动一位。
∀l≤i≤rai=(ai±1)mod10\forall_{l\le i\le r} a_i=(a_i\pm 1)\mod10 ∀l≤i≤r​ai​=(ai​±1)mod10

思路

首先考虑暴力的做法,从a0a1a2a3a_0a_1a_2a_3a0​a1​a2​a3​开始进行BFS,直到走到b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​时跳出。
转移时采用记忆化,总共的状态数为10410^4104,即每次求出一组样例最坏的复杂度为10410^4104。
而T≤105T\le 10^5T≤105,所以复杂度为10910^9109,很明显没法通过。

再考虑预处理,预处理出每一种状态a0a1a2a3a_0a_1a_2a_3a0​a1​a2​a3​转移到其他所有状态的最小步数。
这个复杂度是10810^8108,常数小的或许可以通过这道题。(我没有尝试)

我可以先预处理出0000到其他所有状态的最小步数,对于每个样例a0a1a2a3⇒b0b1b2b3a_0a_1a_2a_3\Rightarrow b_0b_1b_2b_3a0​a1​a2​a3​⇒b0​b1​b2​b3​来说,我可以将a0a1a2a3a_0a_1a_2a_3a0​a1​a2​a3​当成000000000000并对b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​做偏移处理,即可得到答案。
例如:1234⇒23441234 \Rightarrow 23441234⇒2344相当于0000⇒11100000\Rightarrow 11100000⇒1110。

这个偏移的思想和一个前缀和的题很像,可以先把牛牛的猜球游戏补了。

AC的代码

#include <bits/stdc++.h>
using namespace std;
#define si pair<string, int>
#define fi first
#define se secondint vis[10][10][10][10];
int val[10][10][10][10];void init() {queue<si> q;q.push({"0000", 0});vis[0][0][0][0] = 1;val[0][0][0][0] = 0;int res = 0;while (!q.empty()) {si cur = q.front();q.pop();val[cur.fi[0] - '0'][cur.fi[1] - '0'][cur.fi[2] - '0'][cur.fi[3] - '0'] = cur.se;// 一个位置+1for (int i = 0; i < 4; i++) {string tmp = cur.fi;if (tmp[i] == '9')tmp[i] = '0';elsetmp[i]++;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 一个位置-1for (int i = 0; i < 4; i++) {string tmp = cur.fi;if (tmp[i] == '0')tmp[i] = '9';elsetmp[i]--;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 两个位置+1for (int i = 0; i < 3; i++) {string tmp = cur.fi;if (tmp[i] == '9')tmp[i] = '0';elsetmp[i]++;if (tmp[i + 1] == '9')tmp[i + 1] = '0';elsetmp[i + 1]++;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 两个位置-1for (int i = 0; i < 3; i++) {string tmp = cur.fi;if (tmp[i] == '0')tmp[i] = '9';elsetmp[i]--;if (tmp[i + 1] == '0')tmp[i + 1] = '9';elsetmp[i + 1]--;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 三个位置+1for (int i = 0; i < 2; i++) {string tmp = cur.fi;if (tmp[i] == '9')tmp[i] = '0';elsetmp[i]++;if (tmp[i + 1] == '9')tmp[i + 1] = '0';elsetmp[i + 1]++;if (tmp[i + 2] == '9')tmp[i + 2] = '0';elsetmp[i + 2]++;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 三个位置-1for (int i = 0; i < 2; i++) {string tmp = cur.fi;if (tmp[i] == '0')tmp[i] = '9';elsetmp[i]--;if (tmp[i + 1] == '0')tmp[i + 1] = '9';elsetmp[i + 1]--;if (tmp[i + 2] == '0')tmp[i + 2] = '9';elsetmp[i + 2]--;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 四个位置+1for (int i = 0; i < 1; i++) {string tmp = cur.fi;if (tmp[i] == '9')tmp[i] = '0';elsetmp[i]++;if (tmp[i + 1] == '9')tmp[i + 1] = '0';elsetmp[i + 1]++;if (tmp[i + 2] == '9')tmp[i + 2] = '0';elsetmp[i + 2]++;if (tmp[i + 3] == '9')tmp[i + 3] = '0';elsetmp[i + 3]++;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}// 四个位置-1for (int i = 0; i < 1; i++) {string tmp = cur.fi;if (tmp[i] == '0')tmp[i] = '9';elsetmp[i]--;if (tmp[i + 1] == '0')tmp[i + 1] = '9';elsetmp[i + 1]--;if (tmp[i + 2] == '0')tmp[i + 2] = '9';elsetmp[i + 2]--;if (tmp[i + 3] == '0')tmp[i + 3] = '9';elsetmp[i + 3]--;if (vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'])continue;vis[tmp[0] - '0'][tmp[1] - '0'][tmp[2] - '0'][tmp[3] - '0'] = 1;q.push({tmp, cur.se + 1});}}
}int main() {init();int T;cin >> T;while (T--) {string s, t;cin >> s >> t;t[0] -= s[0] - '0' - 10;t[1] -= s[1] - '0' - 10;t[2] -= s[2] - '0' - 10;t[3] -= s[3] - '0' - 10;if (t[0] > '9') t[0] -= 10;if (t[1] > '9') t[1] -= 10;if (t[2] > '9') t[2] -= 10;if (t[3] > '9') t[3] -= 10;int res = val[t[0] - '0'][t[1] - '0'][t[2] - '0'][t[3] - '0'];cout << res << "\n";}return 0;
}

2021 ICPC 沈阳赛区J题 Luggage Lock相关推荐

  1. 2021 ICPC 沈阳站 D题 Journey to Un‘Goro (打表+找规律)

    2021 ICPC 沈阳站 D.Journey to Un'Goro [链接][http://codeforces.com/gym/103202/problem/D](http://codeforce ...

  2. 2021 icpc 沈阳 J-Luggage Lock

    比赛结束后,立马和队友开了一场重现,然后被暴打.  J题是说,给你一把锁,有4位数,每位是0-9,然后给你目前锁的状态,和密码状态,你可以将连续的几个位置同时向上或下拨动,或者你单个位置拨动,问你最后 ...

  3. 2021 ICPC沈阳 J.Luggage Lock(bfs,模拟)

    题目描述 题目链接 题目分析 这是一道很明显的bfs+模拟的题(和八数码是一类题)这是一道很明显的bfs+模拟的题(和八数码是一类题)这是一道很明显的bfs+模拟的题(和八数码是一类题) 因为起点和终 ...

  4. 分类讨论 ---- 2021 icpc 沈阳 L Linear Fractional Transformation (思维题)

    题目链接 题目大意 给你一个线性变换函数f(z)=az+bcz+df(z)=\frac{az+b}{cz+d}f(z)=cz+daz+b​,现在把取值范围扩展到复数域.给你3个等式 f(z1)=w1f ...

  5. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  6. [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  7. 2018 ACM/ICPC 沈阳站 J How Much Memory Your Code Is Using?

    题目描述 In the C++ language, the values of variables are stored somewhere in the computer memory as zer ...

  8. 2021 ICPC 沈阳站总结

    热身赛 4道原题,3道水题+1道防AK(乱搞?)题,10min水出前3题提前下班 正式赛 题目有梯度,给出题人点赞! 开场前1h签了5个到,当时排名很靠前.之后就3人卡3题(ILM),I 我之前一直手 ...

  9. 2021 ICPC济南站的签到题(铜牌题/银牌题):C K

    题目在PTA的教育超市里可以找到:https://pintia.cn/market/item/1459833348620926976 C题:博弈+组合数学 这题给的样例有很好的提示作用.可以想到如果最 ...

最新文章

  1. python手机版iphone-python如何绘制iPhone手机图案?(代码示例)
  2. 4.x版本内核中platform_device的生成
  3. windows7内存诊断工具有用吗_Win7怎么使用自带工具进行内存检测?
  4. IoC--structuremap
  5. 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
  6. tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克
  7. 几天没写代码,就……
  8. SpringBoot2 整合 CXF 服务端和客户端
  9. 微信开发者工具 wxmi修改模版颜色_小白变大师试试免费设计工具:adaptiff
  10. Overleaf 中文硕博论文LaTex模板
  11. sd卡驱动分析之core
  12. 世界主要国家货币名称列表整理[外贸免费工具]
  13. 手机ssh发送文件到服务器,使用ssh传输文件
  14. 高校社团管理系统java_高校社团管理系统设计及实现.doc
  15. 时尚pr标题模板,简约故障风格pr文字模板
  16. 应用程序和操作系统的关系是什么
  17. 自媒体如何推广?推广的渠道有哪些?
  18. c++ std::exception,std::logic_error 异常的使用方法
  19. 新型无线充电技术:能为人体植入设备充电
  20. cygwin的安装及编译和调试程序

热门文章

  1. python实现飞机大战游戏
  2. 牛客网js获取单行,多行输入
  3. el-table合计
  4. JavaScript进阶(三)
  5. html盒模型中border的写法,【前端】盒子模型的边框样式属性和应用技巧讲解
  6. html中鱼眼效果,视频鱼眼效果制作 视频鱼眼效果制作方法
  7. unity【KeyCode 键码】查询表
  8. 计算机专业欧美排名,数字媒体艺术大学排名TOP3世界榜一览!
  9. 墨客UTXO和account模型
  10. iOS Core Bluetooth_1 概述