码迷,mamicode.com
首页 > 其他好文 > 详细

T51658 【wsy】签到题

时间:2018-10-27 00:13:34      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:bfs   ems   break   continue   for   优雅   扩展   数字   scanf   

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\n");
            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\n", 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】签到题

标签:bfs   ems   break   continue   for   优雅   扩展   数字   scanf   

原文地址:https://www.cnblogs.com/Garen-Wang/p/9858937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!