题意:给一个数字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;
}
本文介绍了一个关于数字变换的问题,通过深度优先搜索(DFS)算法来判断是否能够重新排列一个给定数字的各位数,使得新的排列能够被17整除。算法中包含了避免重复状态和无效状态的优化技巧。
9660

被折叠的 条评论
为什么被折叠?



