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

你可能感兴趣的:(poj 1256(Anagram))