题目:
https://ac.nowcoder.com/acm/contest/57943/J
直接用bfs跑一遍就行了,之前跑了很多遍重复了
#include <bits/stdc++.h>
using namespace std;
int n = 100000;
int ans[100010];
void init()
{
ans[0] = 0;
queue<int> q;
q.push(0);
memset(ans, 0x3f, sizeof(ans));
ans[0] = 0;
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = 1; i * i <= n; i++)
{
int n1 = x + i * i, n2 = x - i * i;
// printf("(%d, %d)\n", n1, n2);
if (n1 >= 0 && n1 <= n)
{
if (ans[n1] == 0x3f3f3f3f)
ans[n1] = ans[x] + 1, q.push(n1);
}
if (n2 >= 0 && n2 <= n)
{
if (ans[n2] == 0x3f3f3f3f)
ans[n2] = ans[x] + 1, q.push(n2);
}
}
}
}
int main()
{
init();
int t; scanf("%d", &t);
while (t--) { int x; scanf("%d", &x); printf("%d\n", ans[x]); }
return 0;
}