poj 1256(Anagram)
阿新 • • 發佈:2019-02-08
這道題目確實花了我不少時間,因為好多基礎知識我都忘了,大概還是當初沒有掌握好的原因吧,連帶傳送地址的交換變數都給忘了,還有一些字串函式,比如字串比較函式,字串複製函式。
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); } }