神奇的迭代加深
  • 板块灌水区
  • 楼主Register_int-std=c++14
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/11/29 13:21
  • 上次更新2023/11/3 23:17:42
查看原帖
神奇的迭代加深
406941
Register_int-std=c++14楼主2021/11/29 13:21

题目描述
吸氧前
吸氧后

#include <bits/stdc++.h>
using namespace std;
int st, p, ed = 123804765, limit; 
int a[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
bool f;
unordered_map<int, int> mp;
inline int at(int x, int i) { return x % a[i + 1] / a[i]; }
inline int swap_at(int x, int p, int i) { return x - at(x, i) * a[i] + at(x, i) * a[p]; }
void dfs(int x, int p, int d, int dir) {
    if (mp[x] + dir == 3) f = 1;
    mp[x] = dir;
    if (d == limit) return;
    if (p / 3) dfs(swap_at(x, p, p - 3), p - 3, d + 1, dir);
    if (p / 3 != 2) dfs(swap_at(x, p, p + 3), p + 3, d + 1, dir);
    if (p % 3) dfs(swap_at(x, p, p - 1), p - 1, d + 1, dir);
    if (p % 3 != 2) dfs(swap_at(x, p, p + 1), p + 1, d + 1, dir);
}
int main() {
	scanf("%d", &st);
    for (; at(st, p); p++);
    while (1) {
        dfs(st, p, 0, 1);
        if (f) return 0 * printf("%d", (limit << 1) - 1);
        dfs(ed, 4, 0, 2);
        if (f) return 0 * printf("%d", limit << 1);
        limit++;
    }
    return 0;
}
2021/11/29 13:21
加载中...