用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列,如:512234、412345等
要求:"4"不能在第三位,"3"与"5"不能相连.
此题目和此前一个博客类似(里面有详细解释),只是加上一个过滤函数排除不需要的就可以了。
#include<iostream.h>
bool IsValid( char *str )//过滤函数
{
for( int i=1; *(str+i) != '\0'; i++ )
{
if( i == 2 && *(str+i) == '4' )
return false;
if( *(str+i) == '3' && *(str+i-1) == '5' || *(str+i) == '5' && *(str+i-1) == '3' )
return false;
}
return true;
}
bool repeatnumber(char *bg,char *pch)
{
bool f=false;
for(char *q=bg;q!=pch;q++)
if(*q==*pch)
{
f=true;
break;
}
return f;
}
void pailie(char *ch,char *bg)
{
if(*bg=='\0')
cout<<ch<<endl;
else
{
char tmp;
for(char *pch=bg;*pch!='\0';pch++)
{
/*为了防止字符串中有相同的字符而造成排除的序列一样
而设置repeatnumber()函数进行检查,从bg到pch-1中间是不是
有和pch相同的字符,如果有就说明已经和前面的bg互换完成
不需要继续互换否则就会重复直接下一步
*/
if(bg!=pch&&repeatnumber(bg,pch))
continue;
tmp = *bg;
*bg = *pch;//开始这里面一直报错,错误原因如下图,感谢csdn网友Fire_Lord的帮助
*pch = tmp;
sequence(ch,bg+1);
tmp = *bg;
*bg = *pch;
*pch = tmp;
}
}
}
void main()
{
char ch[]="122345";
pailie(ch,ch);
}