怎样把3个数摆到3个位置,不同次序,显示出所有的排法?

chujidiy 2003-08-29 07:11:21
刚开始,我先这个问题很容易。想想用手在纸上划,一下子就能得到一共有多少种排法。

真的用C写起来,就好麻烦了!有什么好的算法吗?
...全文
122 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chujidiy 2003-09-02
  • 打赏
  • 举报
回复
多谢各位的指教,还有 ZhangYv(闭关修炼~功力暴增中) 给我的网址.我这就揭贴!
ruanzheng13 2003-08-30
  • 打赏
  • 举报
回复
给定了3个数,还是很简单的
3层循环就行了
n个数就用递归
yym314 2003-08-30
  • 打赏
  • 举报
回复
C++标准库中有通用和高效的算法,下面是一个简单的例子:
#include <algorithm>
#include <iostream>
using namespace std;
template <typename BidirectionalIterator,typename T>

void permutation(BidirectionalIterator first, BidirectionalIterator last,T s)
{
sort(first,last);
do{
for(BidirectionalIterator i(first);i!=last;++i)
{
cout << *i; cout << s;
}
cout << endl;
}while (next_permutation(first, last));
}


int main()
{
int A[] = {1,20,3,5};
const int N = sizeof(A) / sizeof(int);
permutation(A, A+N ,",");
}
bahanzo1 2003-08-30
  • 打赏
  • 举报
回复
我觉得可以用递归来做这个问题吧:
首先将三个数任意抽取一个出来放在第一个,剩下的就是余下两个的全排列的问题了,这是很好解决的
n个也同样可以用
kotton8848 2003-08-30
  • 打赏
  • 举报
回复
我觉得时间复杂度很高
简单的还行
但是我们在实际编程的时候不行
caoyun 2003-08-29
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1449/1449551.xml?temp=.4954492
这是我给人骂的一篇帖子,去看吧,全排列的`~
ZhangYv 2003-08-29
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=2987
江川GG 2003-08-29
  • 打赏
  • 举报
回复
在很多的算法引论的书里面都应该有这种排列问题的算法,
chengroad 2003-08-29
  • 打赏
  • 举报
回复
我曾写过一全排列算法的程序,我的算法如下,可以参考。
设n个数,
1。取第一个数,加入排列中(可以用vector、list存储该排列),此时共1排列,其中只1个元素
2。取第二个数,插入第一元素前得一排列,插入第一元素后得另一排列。此时共2排列,其中只2个元素
i。取第i个元素,并依次取上一次所得各排列(每一次排列元素中即为前i-1个数,共有1*2*3*(i-1)个排列),将i元素依次插入该排列中第一、二...元素前得第一、二...排列.并在该排列最后插入i元素,得最后一排列
。。。。。。循环下去即可得n个元素得排列。

简单说,思想就是每次取一个数分别插入原各排列中第一元素前、第二元素前...,最后一元素前,最后一元素后,每次插入都产生一新的排列。
3个来说是很简单的,很快就可以出来。我当时求到6、7还挺快,8、9...就越来越慢了。可以据实际问题作些优化。

算法没有证明过,但应该没有问题。
fangrk 2003-08-29
  • 打赏
  • 举报
回复
如果使用C++,使用next_permutation
leasun 2003-08-29
  • 打赏
  • 举报
回复
这种问题用递归解决比较简单
Dragon132 2003-08-29
  • 打赏
  • 举报
回复
这个简单一点

#include <stdio.h>
main()
{
int i,j;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{
if(i==j)
continue;
printf("%4d%4d%4d\n",i,j,6-i-j);
}
}
Dragon132 2003-08-29
  • 打赏
  • 举报
回复
穷举吧!

#include <stdio.h>
main()
{
int i,j,k;
for(i=1;i<4;i++)
for(j=1;j<4;j++)
{
if(i==j)
continue;
for(k=1;k<4;k++)
if(k==i||k==j)
continue;
else
printf("%4d%4d%4d\n",i,j,k);
}
}

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧