| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2296 人关注过本帖
标题:[求助]问一个“全排列算法”的问题
只看楼主 加入收藏
totohack
Rank: 1
等 级:新手上路
帖 子:133
专家分:0
注 册:2007-7-15
收藏
 问题点数:0 回复次数:10 
[求助]问一个“全排列算法”的问题
问题:0-9的数进行全排列,也就是
0123456789
0123456798
0123456879
...........
...........
9876543210

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

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

求一算法,我百思不得其解,大家有什么好建议,尽管提出来,在这,我先谢过大家了。
搜索更多相关主题的帖子: 全排列算法 嵌套 goto 数字 
2007-07-21 17:10
孤魂居士
Rank: 2
来 自:老A(中国地大)
等 级:论坛游民
威 望:4
帖 子:1142
专家分:18
注 册:2007-5-21
收藏
得分:0 

我回去给你想想````

准备用3年做个高级软件工程师 10年也做不成。准备用10年做成高级软件工程师 3年就成了QQ 群 45771086
欢迎版主...欢迎JAVA爱好者...
一起从深夜 到凌晨...
2007-07-21 17:34
弑神饕餮
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-6-6
收藏
得分:0 
没想出来 大家一起努力啊
不过我觉得我们可以先把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个数上试试行不行?

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

爱情如潮水般滚滚迩来,总有一天滚滚滚回去!!天长地久惟有java!
2007-07-21 17:47
totohack
Rank: 1
等 级:新手上路
帖 子:133
专家分:0
注 册:2007-7-15
收藏
得分:0 
有道理,我再好好想想!

2007-07-21 20:46
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
明显用DFS,当然我也见过非DFS的算法,是基于交换的。让我想想看还能不能写出来
2007-07-22 00:56
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 

这就是那个基于交换的算法,它的思想可能对于没学过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);
}

2007-07-22 01:16
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 

我总是不分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);
}

2007-07-22 01:24
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
stl,恩恩

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2007-08-02 12:26
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-02 15:20
TcStan
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-8-2
收藏
得分:0 

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


I Trust ME
2007-08-02 15:52
快速回复:[求助]问一个“全排列算法”的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058910 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved