您的位置:首页 > 其它

poj 1256(Anagram)

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

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: