| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1835 人关注过本帖
标题:[求助]关于错排程序问题!
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
#define N 5
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[5];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}

else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i ;

for(i=0;i<N;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,N);
printf("\n");
return(0);
}
/*不知道楼主是这个意思*/


倚天照海花无数,流水高山心自知。
2006-09-06 17:34
shazhudi
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-9-6
收藏
得分:0 
谢谢:)
谢谢指导!!这个题目的原题是:
n个有序的元素应有n!个不同的排列。若有一个排列使得所有元素都不在原来位置上,则称这个排列为错排。任给一个n,编写程序求出1,2,…,n的所有错排方案及错排个数Dn。
1)输入n;
2)输出1,2,…,n的所有错排方案及错排个数Dn。

要列出所有的错排方案的
2006-09-07 14:09
shazhudi
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-9-6
收藏
得分:0 
:0

刚才运行了11楼的程序,没有错误,但是好象有点不符合题意,可能是我说的不够清楚,还是很谢谢你喔!
原题已经发在上面了,不知道还能不能帮帮忙啊,谢谢啊!!!

2006-09-07 14:17
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
收藏
得分:0 
你可以在11楼的基础上加上一条scanf()语句,同时更改宏定义中N的长度.

不过这个程序的计算不会超过 15!,在 8!以下的时间复杂度是可以忍受的,也就是说只能对8个数进行排序统计。

由于工作,N久都没来了!
2006-09-07 15:15
shazhudi
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-9-6
收藏
得分:0 
14楼的要是会的话,直接把程序弄出来吧
谢谢啊!
2006-09-07 16:20
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
收藏
得分:0 
[QUOTE]14楼的要是会的话,直接把程序弄出来吧
谢谢啊![/QUOTE]

干嘛,激我呢?

不会!

由于工作,N久都没来了!
2006-09-07 16:35
shazhudi
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-9-6
收藏
得分:0 
别啊!大哥,我才是真的不会
帮帮忙嘛!
2006-09-07 17:25
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
收藏
得分:0 

#include <stdio.h>
#include <string.h>
#define N 100
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[N];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}

else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i,n;
puts("输入数字");
scanf("%d",&n);
for(i=0;i<n;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,n);
printf("\n");
return(0);
}

就这样,很简单吧。

输入不要大于8,否则你会等很久。


由于工作,N久都没来了!
2006-09-07 18:09
shazhudi
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-9-6
收藏
得分:0 
呵呵!厉害,太好了!谢谢啊~
马上试试喔
2006-09-07 18:39
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
#define N 10
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[5];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}

else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i,n;
printf("输入位数:(不超过9)");
scanf("%d",&n);
for(i=0;i<n;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,n);
printf("\n");
return(0);
}
/*这里的全排列当然全是个位数字,我只能给出到9的了,虽然超过这个可以运行出来,但是9时,运行时间已经不能忍受了.*/


倚天照海花无数,流水高山心自知。
2006-09-07 19:20
快速回复:[求助]关于错排程序问题!
数据加载中...
 
   



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

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