T51658 【wsy】签到题

原文链接: http://www.cnblogs.com/Garen-Wang/p/9858937.html

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

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

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

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

哎,我还是太菜了!

代码:

#include
#include
#include
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 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;
}

转载于:https://www.cnblogs.com/Garen-Wang/p/9858937.html

你可能感兴趣的:(T51658 【wsy】签到题)