因为这个蓝翔杯,我发现我暴力还是太差了,所以决定开始把紫书上的暴力都做一做。
这道题,不可能枚举十个数字,我们知道了n,枚举除数,得到被除数,验证一下即可。
坑的地方在于,他要求两个输出之间有空格,但是又不是指每个输出后面都有空格,解决方法就是,先定义一个k=0,进入循环后判断k,这样就可以跳过第一次输出空格,后面只要在进入循环就说明前面有个样例已经输出答案,然后输出空行。
#include<bits/stdc++.h>
using namespace std;
int vst[10], n;
bool flag;
bool Check(int t)
{
int a[10], k = 0;
while(t)
{
a[k++] = t % 10;
t /= 10;
}
sort(a, a + k);
int len = unique(a, a + k) - a;
if(k == 5 && len == 5)
{
for(int i = 0; i < k; i++)
if(vst[a[i]])
return false;
return true;
}
return false;
}
void dfs(int sum, int x)
{
if(x == 5)
{
if(Check(n * sum))
{
flag = 1;
printf("%05d / %05d = %d\n", n * sum, sum, n);
}
return;
}
else
{
for(int i = 0; i < 10; i++)
{
if(!vst[i])
{
vst[i] = 1;
dfs(sum * 10 + i, x + 1);
vst[i] = 0;
}
}
}
}
int main()
{
int k = 0;
while(scanf("%d", &n) , n)
{
if(k)
printf("\n");
k = 1;
flag = 0;
for(int i = 0; i < 10; i++)
{
vst[i] = 1;
dfs(i, 1);
vst[i] = 0;
}
if(!flag)
printf("There are no solutions for %d.\n", n);
}
return 0;
}