T51658 wsy签到题

Posted garen-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T51658 wsy签到题相关的知识,希望对你有一定的参考价值。

luogu模拟赛T1,爆零的我实在是太菜了!

这道题很容易想到bfs的思路,但是如何优雅地扩展状态?

我原本的做法是记录每一位,然后慢慢去扩展状态,结果爆零了。不知道为什么。

std的做法是直接通过运算来得到新的数字。通过许多比较不显然的除法和取膜就可以完成节点的扩展。

哎,我还是太菜了!

代码:

#include<cstdio>
#include<cstring>
#include<queue>
const int maxn = 1000005;
const int INF = 0x3f3f3f3f;
const int pwd[] = {1, 10, 100, 1000, 10000, 100000};
bool ok[maxn];
int dist[maxn];
int main()
{
    for(int i = 0; i <= 1000; i++) ok[i * i] = true;
    int T; scanf("%d", &T);
    while(T--)
    {
        int x; scanf("%d", &x);
        if(ok[x])
        {
            printf("0
");
            continue;
        }
        memset(dist, 0x3f, sizeof dist);
        dist[x] = 0;
        std::queue<int> q;
        q.push(x);
        while(!q.empty())
        {
            int u = q.front(); q.pop();
            if(ok[u])
            {
                printf("%d
", dist[u]);
                break;
            }
            for(int i = 0; i <= 5; i++)
            {
                if(pwd[i] > u) break;
                int pos = u / pwd[i] % 10;
                int v = u - pos * pwd[i];
                for(int j = 0; j <= 9; j++)
                {
                    int newu = v + j * pwd[i];
                    if(dist[newu] == INF && newu)
                    {
                        dist[newu] = dist[u] + 1;
                        q.push(newu);
                    }
                }
                int newu = u % pwd[i] + (u / pwd[i + 1]) * pwd[i];
                if(dist[newu] == INF && newu)
                {
                    dist[newu] = dist[u] + 1;
                    q.push(newu);
                }
            }
        }
    }
    return 0;
}

以上是关于T51658 wsy签到题的主要内容,如果未能解决你的问题,请参考以下文章

一道有趣的签到题

Inversion 多校签到题

HDU - 1061-快速幂签到题

牛客,第二十届北京师范大学程序设计竞赛,签到题7题

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)