100分想赠,企盼高手帮我解决这个小小的问题!
小弟最近在算一个工厂的布局的物流程序,主要就是8个点之间找出一个合适的排列方式使物流费用最小!
现在的核心问题被我化到:讲7!次组合排列出来!
比如——我用三种情况举例一下!
a=1,b=2,c=3;
a=1,b=3,c=2;
a=2,b=1,c=3;
a=2,b=3,c=1;
a=3,b=1,c=2;
a=3,b=2,c=1;
象这样列举
编个程序能将7!种排列方式排出来
a=1,b=2,c=3,d=4,e=5,f=6,g=7
.......
a=7,b=6,c=5,d=4,e=3,f=2,g=1
我自己编的那个太复杂了,希望找一个简单的,请高手解决
问题点数:100、回复次数:6Top
1 楼liujingfu123(Oh_My_GoD)回复于 2006-03-04 19:01:10 得分 0
自己搞定咯!!!Top
2 楼cunsh(村少)回复于 2006-03-04 19:29:02 得分 20
/*
例4:将1到N的N个自然数排成一列,共有1*2*3……*N种不同的排列方法,如N=3时,有6种排列方案,分别为123,132,213,231,312,321.试编程序输出1到N的全部排列,假设N<10.
为了设计出由计算机输出1到N的全部排列程序,就必须寻找不同排列之间的规律.通过观察N=5(参见本例的运行结果)的排列情况,可以发现,如果把每个排列看作一个自然数,则所有排列对应的数是按从小到大的顺序排列,从当前的排列产生下一个排列时必然会造成某一位置上的数字变大,这一位置显然应该尽量靠右,并且在它左边位置上的数字保持不变,这就意味着这一位置变成的数字来自于它的右边, 并且变大的幅度要尽可能小,也就是说在它右边如有几个数同时比它大时,应该用其中最小的来代替它.由于这一位置是满足上述条件的最右边的一位,所以在它右边的所有数字按逆序排列,即在这些数字的右边没有一个大于它的数.程序中先从右至左找到第一个位置,该位置上的数比它右边的数小,这个位置就是所要找的满足上述条件的位置,然后再从右到左找到第一个比该位置上的数字大的数字所在的位置,将这两个位置上的数字交换,再将该位置右边的所有元素颠倒过来,即将它们按从小到大的顺序排列,就得到了下一个排列.
结果应该是:
Input n:5
12345 12354 12435 12453 12534 12543 13245 13254 13425 13452
13524 13542 14235 14253 14325 14352 14523 14532 15234 15243
15324 15342 15423 15432 21345 21354 21435 21453 21534 21543
23145 23154 23415 23451 23514 23541 24135 24153 24315 24351
24513 24531 25134 25143 25314 25341 25413 25431 31245 31254
31425 31452 31524 31542 32145 32154 32415 32451 32514 32541
34125 34152 34215 34251 34512 34521 35124 35142 35214 35241
35412 35421 41235 41253 41325 41352 41523 41532 42135 42153
42315 42351 42513 42531 43125 43152 43215 43251 43512 43521
45123 45132 45213 45231 45312 45321 51234 51243 51324 51342
51423 51432 52134 52143 52314 52341 52413 52431 53124 53142
53214 53241 53412 53421 54123 54132 54213 54231 54312 54321
/*
#include<iostream>
using namespace std;
void main(){
int n; //n个数字的排列;
cout<<"input:";
cin>>n;
int *p=new int[n]; //数组保存各位数字;
for(int i=0;i<n;i++) //初始化为第一个排列;
p[i]=i+1;
do{
for(i=0;i<n;i++) //输出排列中的数字
cout<<p[i]<<" ";
cout<<endl;
for(int j=n-1;j>0;j--) //从右向左;找要交换的位置1(j);
if(p[j]>p[j-1]) break;
if(j==0)break; //找不到要交换的位置.退出do
j--;
for(int k=n-1;k>j;k--) //在位置1右边;从右向左;
//找要交换的位置2(k);
if(p[k]>p[j])break;
swap(p[k],p[j]); //交换位置1和位置2的值;
//把位置1后边的所有位反序排列;
for(int x=j+1,y=n-1;x<y;x++,y--)
swap(p[x],p[y]);
}while(1);
delete []p;
}
Top
3 楼duduhaha(三人行必有我师)回复于 2006-03-04 20:07:43 得分 80
#include <stdio.h>
#define MAX 7
int used[MAX];
int result[MAX];
int N;
void print(){
printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d\n ", result[0],result[1],result[2],result[3],result[4],result[5],result[6]);
}
void proc(int step)
{
int i;
if(step == N)
print();
else
{
for(i = 0; i < N; i++)
{
if(!used[i])
{
used[i] = 1;
result[step] = i + 1;
proc(step + 1);
used[i] = 0;
}
}
}
}
int main(void)
{
N = 7;
proc(0);
}
Top
4 楼mfs(玩命蚂蚁)回复于 2006-03-04 21:25:37 得分 0
我只会用7个for循环.:(Top
5 楼bluehacker88()回复于 2006-03-04 22:16:31 得分 0
#include <stdlib.h> /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
void print(char *str , int n );
void main()
{
char s[] = {'a','b','c','\n','\0' };
print(s, 3);
}
void swap(char & a,char & b)
{
char c;
c = a;
a = b;
b = c;
}
void print(char *str , int n )
{
int i;
if( n > 1)
{
for( i = 0 ; i < n ; i++)
{
swap(str[i],str[n-1]);
print(str,n-1);
swap(str[i],str[n-1]);
}
}
else
{
printf("%s",str);
}
}Top
6 楼minsavage(帆野)回复于 2006-03-07 20:47:08 得分 0
markTop




