1. 程式人生 > >poj 1256(Anagram)

poj 1256(Anagram)

         這道題目確實花了我不少時間,因為好多基礎知識我都忘了,大概還是當初沒有掌握好的原因吧,連帶傳送地址的交換變數都給忘了,還有一些字串函式,比如字串比較函式,字串複製函式。

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);
	}
}