当前位置: 代码迷 >> C语言 >> [求助]问一个“全排列算法”的问题
  详细解决方案

[求助]问一个“全排列算法”的问题

热度:176   发布时间:2007-07-21 17:10:11.0
[求助]问一个“全排列算法”的问题
问题:0-9的数进行全排列,也就是
0123456789
0123456798
0123456879
...........
...........
9876543210

一行数中不能有重复的数字。

要求:不用goto,少用嵌套循环,嵌套不超过6次,越少越好

求一算法,我百思不得其解,大家有什么好建议,尽管提出来,在这,我先谢过大家了。
搜索更多相关的解决方案: 全排列算法  嵌套  goto  数字  

----------------解决方案--------------------------------------------------------

我回去给你想想````
----------------解决方案--------------------------------------------------------
没想出来 大家一起努力啊
不过我觉得我们可以先把3个的写出来再类推上去
例如如果是012的话他就有3*2种012
021
102
120
201
210
我们来分析一下,我们定义一个数组a[3]={0,1,2}
那么我们要做的有哪几步呢?
1首先printf("%d%d%d",a[0],a[1],a[2]);
2接下来我们需要将a[1],a[2]的位置换一下然后再printf("%d%d%d",a[0],a[1],a[2]);
3将a[0]与a[1]换,printf
4将a[1]与a[2]换,printf
5将a[0]与a[1]换,printf
6将a[1]与a[2]换,printf
貌似有点规律,你试着把它推广到10个数上试试行不行?

再想想函数递归调用,我感觉能用上~~~因为有事所以先走一步,我回去也好好想想~~~~

----------------解决方案--------------------------------------------------------
有道理,我再好好想想!
----------------解决方案--------------------------------------------------------
明显用DFS,当然我也见过非DFS的算法,是基于交换的。让我想想看还能不能写出来
----------------解决方案--------------------------------------------------------

这就是那个基于交换的算法,它的思想可能对于没学过DFS的人来说更容易接受,而且避免了DFS中一个判重复问题,还是不错的一个算法。

程序代码:

#include <iostream>

using namespace std;

int x[10]={0,1,2,3,4,5,6,7,8,9};

void out(int* a,int n)
{
if(n){
printf(\"%d\",a[0]);
}
for(int i=1;i<n;i++){
printf(\" %d\",a[i]);
}
printf(\"\n\");
}

void p(int n,int k=0)
{
if(k==n){
out(x,n);
}
else {
for(int i=k;i<n;i++){
swap(x[k],x[i]);
p(n,k+1);
swap(x[k],x[i]);
}
}
}

int main()
{
p(10);
}


----------------解决方案--------------------------------------------------------

我总是不分C板块和C++板块,重写一遍

程序代码:

#include <stdio.h>

int x[10]={0,1,2,3,4,5,6,7,8,9};

void out(int* a,int n)
{
int i;
if(n){
printf(\"%d\",a[0]);
}
for(i=1;i<n;i++){
printf(\" %d\",a[i]);
}
printf(\"\n\");
}

void swap(int* a,int* b)
{
int t;
t=*a;
*a=*b;
*b=t;
}

void p(int n,int k)
{
int i;
if(k==n){
out(x,n);
}
else {
for(i=k;i<n;i++){
swap(&x[k],&x[i]);
p(n,k+1);
swap(&x[k],&x[i]);
}
}
}

void pemutation(int n)
{
p(n,0);
}

int main()
{
pemutation(10);
}


----------------解决方案--------------------------------------------------------
stl,恩恩
----------------解决方案--------------------------------------------------------
这个很详细:
http://bbs.bc-cn.net/viewthread.php?tid=90424&star=at#
----------------解决方案--------------------------------------------------------

,,,,,,,,,,,,,


----------------解决方案--------------------------------------------------------
  相关解决方案