B. Ugly Pairs(简单dfs)
题目链接:
https://codeforces.com/problemset/problem/1156/B
题目大意:
给你一个字符串,然后你可以重新对这个字符串的元素进行排序,使得新获得的字符串不存在相邻的asci相差为1.a和z的差值不是1
具体思路:
暴力搜索,按照字典树的构图方式去搜索。
注意点:对答案数组每一次清空,memset(ans,'\0',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,'\0',sizeof(ans));
49 // memset(tmp,'\0',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\n");
59 else
60 printf("%s\n",ans);
61 }
62 return 0;
63 }