69,369
社区成员
发帖
与我相关
我的任务
分享
void ListPermutations( char *s )
请赐教
#include <stdio.h>
void listperm( char * , char * );
int in ( char , char * , char * );
void swap ( char * , char * );
int main(void)
{
char str[]="AAABBB";
listperm(str,str);
return 0;
}
void listperm( char *firm , char *move )
{
static int len;
if ( *move == '\0' )
{
if ( *firm =='\0')puts( firm - len );
return;
}
if ( !in ( *move , firm , move - 1 ) )
{
swap( firm , move );
len ++;
listperm( firm + 1 , firm + 1 );
len --;
swap( firm , move );
}
listperm( firm , move + 1 );
}
int in( char c , char * front , char * behind )
{
if( front > behind )return 0;
if( c == *behind ) return 1;
return in ( c , front , behind -1 );
}
void swap(char *c1 , char *c2)
{
char temp;
temp = *c1;
*c1 = *c2;
*c2 = temp;
}
#include <stdio.h>
#include <string.h>
void Swap( char *a, char *b )
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//IsDup: 之前是否有重复的元素,有的话返回1,没有返回0
//如果i == j返回0
int IsDup( char *s, unsigned int k, unsigned int i )
{
unsigned int j;
if (k == i)
return 0;
else if (s[k] == s[i])
return 1;
else
{
for (j=i-1; j>k; --j)
{
if (s[j] == s[i])
return 1;
}
}
return 0;
}
//RecursivePermute: ListPermute的驱动
//k的含义是固定了的前k个字符
void RecursivePermute( char *s, unsigned int k)
{
unsigned int i;
if (strlen(s) == k)
{
puts( s );
}
else
{
for (i=k; i<strlen(s); ++i)
{
if( !IsDup(s,k,i) )
{
Swap( s+k, s+i);
RecursivePermute( s,k+1 );
Swap( s+k, s+i );
}
else
continue;
}
}
}
//ListPermutation:
void ListPermutation( char *s )
{
RecursivePermute( s, 0 );
}
void main()
{
char s[] = "AABB";
ListPermutation( s );
}