如何求出 ABCD 的各种排列?
就是把 ABCD 这四个字母的所有可能的顺序都输出,应该怎么写呢? 问题点数:20、回复次数:9Top
1 楼pcboyxhy(-273.15℃)回复于 2005-04-02 11:34:05 得分 5
#include <stdio.h>
#include <stdlib.h>
char used[20]={0};
int number[20], len, i, p[20];
void output()
{
printf("\n");
for(i=0; i<len; ++i)
printf("%d ", number[p[i]]);
}
int pailie(int n)
{
int ii;
if(n==len)
output( );
for(ii=0; ii<len; ++ii)
if(!used[ii])
{
used[ii] = 1;
p[n] = ii;
pailie(n+1);
used[ii] = 0;
}
return 0;
}
int main(int argc, char *argv[])
{
int index = 0;
scanf("%d", &len);
while(index<len)
scanf("%d", &number[index++]);
pailie(0);
system("PAUSE");
return 0;
}
这个是针对整数的
字符的只要稍微修改一下Top
2 楼QunKangLi(心里面疼得有点发酸 一定是有雾来了 打湿了我的眼眶)回复于 2005-04-02 11:36:01 得分 5
当还有数没选中时,循环取遍当前还没选中的数,将余下的进行递归运算.
数组中依次存入ABCD,当前选第N个数时,从X=N开始到X=4-N,将X元素与A元素互换,然后用&X进行递归.递归返回后互换X,A以恢复原数组Top
3 楼kozzii(double-double)回复于 2005-04-02 11:41:04 得分 3
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s("ABCD");
while(next_permutation(s.begin(),s.end()))
{
cout<<s<<endl;
}
system("pause");
return 0;
}Top
4 楼lyx6988()回复于 2005-04-02 11:42:47 得分 7
回溯算法
int n;
char used[MaxN];
int p[MaxN];
void permute(int pos)
{ int i;
/*如果已是第r个元素了,则可打印r个元素的排列 */
if (pos==n) {
for (i=0; i<n;i++)
cout << (p[i]+1);
cout << endl;
return;
}
for (i=0; i<n;i++)
if (!used[i]) { /*如果第i个元素未用过*/
/*使用第i个元素,作上已用标记,目的是使以后该元素不可用*/
used[i]++;
/*保存当前搜索到的第i个元素*/
p[pos] = i;
/*递归搜索*/
permute(pos+1);
/*恢复递归前的值,目的是使以后改元素可用*/
used[i]--;
}
}
Top
5 楼andycpp(幻瞳)回复于 2005-04-02 11:43:20 得分 0
楼上的 STL我也会用啊 现在只不过想知道一下原理 呵呵Top
6 楼andycpp(幻瞳)回复于 2005-04-02 11:45:22 得分 0
谢谢大家支持
午饭后回来结贴
我喜欢有注释的代码 HOHO~~~~~~~~Top
7 楼kozzii(double-double)回复于 2005-04-02 11:45:39 得分 0
少了一个;;
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s("ABCD");
do{
cout<<s<<endl;
}while(next_permutation(s.begin(),s.end()));
system("pause");
return 0;
}Top
8 楼kozzii(double-double)回复于 2005-04-02 11:46:07 得分 0
faintTop
9 楼andycpp(幻瞳)回复于 2005-04-02 11:46:10 得分 0
谢谢大家支持
午饭后回来结贴
我喜欢有注释的代码 HOHO~~~~~~~~Top




