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签到题的主要内容,如果未能解决你的问题,请参考以下文章