B. Ugly Pairs(简单dfs)

  题目链接:

https://codeforces.com/problemset/problem/1156/B

题目大意:

给你一个字符串,然后你可以重新对这个字符串的元素进行排序,使得新获得的字符串不存在相邻的asci相差为1.a和z的差值不是1

具体思路:

暴力搜索,按照字典树的构图方式去搜索。

注意点:对答案数组每一次清空,memset(ans,'',sizeof(ans));否则测试长度的时候会保留上册的信息。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define inf 0x3f3f3f3f
 4 # define ll_inf (1ll<<60)
 5 # define ll long long
 6 const int maxn = 200;
 7 char str[maxn];
 8 char ans[maxn];
 9 int a[30],flag,len;
10 void dfs(int num,char tmp[])
11 {
12     if(flag)
13         return ;
14     if(num==len)
15     {
16         flag=1;
17         for(int i=0; i<num; i++)
18         {
19             ans[i]=tmp[i];
20         }
21         return ;
22     }
23     for(int i=0; i<26; i++)
24     {
25         if(a[i]&&(num==0||(abs(tmp[num-1]-('a'+i))!=1)))
26         {
27             int t=num;
28             int cnt=a[i];
29             for(int j=1; j<=cnt; j++)
30             {
31                 tmp[t++]='a'+i;
32           //      cout<<tmp[t-1]<<endl;
33             }
34             a[i]=0;
35             dfs(t,tmp);
36             a[i]=cnt;
37         }
38     }
39 }
40 int main()
41 {
42     int T;
43     scanf("%d",&T);
44     while(T--)
45     {
46         scanf("%s",str);
47         memset(a,0,sizeof(a));
48         memset(ans,'',sizeof(ans));
49       //  memset(tmp,'',sizeof(tmp));
50         len=strlen(str);
51         for(int i=0; i<len; i++){
52             a[str[i]-'a']++;
53         }
54         flag=0;
55         char tmp[110];
56         dfs(0,tmp);
57         if(strlen(ans)!=len)
58             printf("No answer
");
59         else
60             printf("%s
",ans);
61     }
62     return 0;
63 }
原文地址:https://www.cnblogs.com/letlifestop/p/10946254.html