poj 1256(Anagram)

来源:互联网 发布:go 读写分离 mysql 编辑:程序博客网 时间:2024/06/04 18:37

         这道题目确实花了我不少时间,因为好多基础知识我都忘了,大概还是当初没有掌握好的原因吧,连带传送地址的交换变量都给忘了,还有一些字符串函数,比如字符串比较函数,字符串复制函数。

qsort函数的用法也给忘了哭看来我记住的没多少啊难过 应该还是练得比较少吧,大二下了,该多刷刷题了

这道题就是一个全排列的问题,只是加了一些条件,A<a<B<b<C<c……排列必须按照从小到大的顺序输出,所以还得稍微改一下全排列的代码,每次确定一个数后得重新排序,把小的字母放前面,还好算法书上有全排列的代码,改改就可以做出来的,全排列主要就是递归,这个题用回溯大概会比较容易理解一些,改天再看回溯的方法吧,明天还有算法上机课,放代码,然后陪她聊会天就睡觉大笑

#include<stdio.h>#include<stdlib.h>#include<string.h>void swap(char *a,char *b){char t;t=*a;*a=*b;*b=t;}int find(char b,char a){if(a <= 'Z' && a >= 'A' && b <= 'Z' && b >= 'A')          return a < b;      if(a <= 'z' && a >= 'a' && b <= 'z' && b >= 'a')          return a < b;      if(a <= 'Z' && a >= 'A' && b <= 'z' && b >= 'a')          return a + 32 <= b;      if(a<='z' && a >='a' && b <= 'Z' && b >= 'A')          return a < (b + 32);  }int cmp(const void *a,const void *b){    return find(*(char *)a,*(char *)b);}void perm(char a[],int k,int m){int c[100];memset(c,0,sizeof(c));if(k==m)    printf("%s\n",a);else{for(int i=k;i<=m;i++){    char p[20];    strcpy(p,a);    if(a[i]==a[k]&&i!=k)continue;if(c[a[i]-65])continue;swap(&a[k],&a[i]);qsort(a+k+1,m-k,sizeof(a[0]),cmp);if(k!=i)c[a[k]-65]=1;perm(a,k+1,m);a=p;}}}int main(){int n,m;char a[20];scanf("%d",&n);while(n--){memset(a,'\0',sizeof(a));scanf("%s",a);m=strlen(a);qsort(a,m,sizeof(a[0]),cmp);perm(a,0,m-1);}} 

0 0