一道搜索题,先爆出所有1-9的所有排列,然后依次枚举就行了~
注意一个地方的剪枝
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e6+1000;
char num[maxn][11];
int cnt=0,n;
bool vis[11];
void Init(int index)
{
if(index==9)
{
num[cnt++][9]='\0';
strcpy(num[cnt],num[cnt-1]);
return;
}
for(int i=1;i<10;i++)
if(!vis[i])
{
num[cnt][index]=i+'0';
vis[i]=1;
Init(index+1);
vis[i]=0;
}
}
int Is(int index,int val)
{
int a=0,b,c,ans=0;
for(int i=0;i<9;i++)
{
a=a*10+num[index][i]-'0';
b=0;
int j=i+1;
for(;j<((8-i)>>1)-1;j++)
b=b*10+num[index][j]-'0';
for(;j<8;j++)
{
b=b*10+num[index][j]-'0';
c=0;
for(int k=j+1;k<9;k++)
c=c*10+num[index][k]-'0';
if(b%c!=0)
continue;
if(a+b/c==val)
ans++;
}
}
return ans;
}
int main()
{
Init(0);
while(scanf("%d",&n)!=EOF)
{
int ans=0;
for(int i=0;i<cnt;i++)
ans+=Is(i,n);
printf("%d\n",ans);
}
return 0;
}