题意:给一个数字n,允许调换各数位的位置,但不允许有前导零,问能否组成能被17整除的数。
思路:深搜构造出所有数字即可,优化的地方就是同一个位置的数字枚举一次就行了,避免重复。
# include <bits/stdc++.h>
using namespace std;
char s[20], t[20], len;
bool flag;
int vis[20];
bool judge(char *t)
{
int ans=0;
for(int i=0; i<len; ++i)
ans = (ans*10+t[i]-'0')%17;
return ans == 0;
}
bool dfs(int cnt)
{
if(cnt == len)
{
if(judge(t))
return true;
return false;
}
for(int i=0; i<len; ++i)
{
if(vis[i] || (cnt==0&&s[i]=='0')) continue;
vis[i] = 1;
t[cnt] = s[i];
if(dfs(cnt+1)) return true;
vis[i] = 0;
while(i+1<len&&s[i]==s[i+1]) ++i;//优化。
}
return false;
}
int main()
{
flag = false;
scanf("%s",s);
len = strlen(s);
sort(s, s+len);
memset(vis, 0, sizeof(vis));
if(dfs(0)) printf("%s\n",t);
else puts("-1");
return 0;
}