你就把程序写出来呀
#include<conio.h>
#include<stdio.h>
#define N 20
int B[N],numofteacher,help[N+1]={0};;
static char T[N];
char array[N+1]={'\0'};
void Formlist(int n);
int main()
{
int i,j,k=0;
char ch=65;
printf("Please input the number of the teachers:");
do{
scanf("%d",&numofteacher);
if(numofteacher<0||numofteacher>20)
puts("Input wrong!enter again:\n");
}while(numofteacher<0||numofteacher>20);
printf("Now enter the classes number of each teacher has:");
for(i=0;i<numofteacher;i++)
{
scanf("%d",help+i);
for(j=k;j<sum(help,i+1);j++)
array[j]=ch;
k=j;
ch++;
}
Formlist(0);
getch();
return 0;
}
void Formlist(int n)
{ int i,m,j,k,c=0;
if(n==N)
{
for(m=1;m<numofteacher;m++)
{
if(m==1)
{
for(j=0;j<help[0];j++)
if(B[j]>help[0])
{
c=1;
goto out;
}
}
else
if(!c)
{
int p=sum(help,m-1),q=sum(help,m);
for(j=p;j<q;j++)
if(B[j]>q||B[j]<p)
{
c=1;
goto out;
}
}
if(0)
out:{
for(i=0;i<N+1;i++)
printf("%c",array[B[i]-1]);
printf("\n");
c=0;
getch();
}
}
}
else
{
for(k=0;k<N;k++)
{
if(!T[k])
{
B[n]=k+1;
T[k]=1;
}
else continue;
Formlist(n+1);
T[k]=0;
}
}
}
int sum(int help[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
sum+=help[i];
return sum;
}
晕死我了,我只试了一个班级,打印出全部组合,
可我调了N久,还是有问题饿.....
楼主您帮我改改吧.
我的垃圾算法:
构造一个20的全排列,每个数对应一个字母(即为学科)
打印出结果。
昨天想了一晚上,今天还是没调好,晕死我了,而且越调越不可思仪,弄得我都晕了!!
哎!
以
5
4 4 4 4 4
为输入,
上面的程序还少一个"AAAABBBBCCCCDDDD"
而且程序在输出所有答案并没有进行检验是否已经和前面重复.
我原本以为问题很好解决,但调了老半天,第二个问题,老是解决不了.
大家来帮忙看一下,
下面这个是又调了的程序,
#include<conio.h>
#include<stdio.h>
#define N 20
int B[N],numofteacher,help[N+1]={0};;
static char T[N];
char array[N+1]={'\0'};
char record[N+1]={'\0'};
void Formlist(int n);
int main()
{
int i,j,k=0;
char ch=65;
printf("Please input the number of the teachers:");
do{
scanf("%d",&numofteacher);
if(numofteacher<0||numofteacher>20)
puts("Input wrong!enter again:\n");
}while(numofteacher<0||numofteacher>20);
printf("Now enter the classes number of each teacher has:");
for(i=0;i<numofteacher;i++)
{
scanf("%d",help+i);
for(j=k;j<sum(help,i+1);j++)
array[j]=ch;
k=j;
ch++;
}
for(i=0;i<N+1;i++)
record[i]=array[i];
Formlist(0);
getch();
return 0;
}
void Formlist(int n)
{ int i,m,j,k,c=0;
if(n==N)
{
for(m=1;m<numofteacher;m++)
{
if(m==1)
{
for(j=0;j<help[0];j++)
if(B[j]>help[0])
{
c=1;
goto out;
}
}
else
if(!c)
{
int p=sum(help,m-1),q=sum(help,m);
for(j=p;j<q;j++)
if(B[j]>q||B[j]<p)
{
c=1;
goto out;
}
}
if(0)
out:{
for(i=0;i<N;i++)
printf("%c",record[i]);
for(i=0;i<N+1;i++)
{
if(record[i]!=array[B[i]-1])
{
for(j=0;j<N+1;j++)
sprintf(&record[j],"%c",array[B[j]-1]);
break;
}
}
printf("\n");
c=0;
getch();
}
}
}
else
{
for(k=0;k<N;k++)
{
if(!T[k])
{
B[n]=k+1;
T[k]=1;
}
else continue;
Formlist(n+1);
T[k]=0;
}
}
}
int sum(int help[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
sum+=help[i];
return sum;
}
现在我又设定了一个record数组,用来区别和下一个数组array[B[]+1]是否完全相同,如果有不同的,则全部赋给record.但却达不到区分的效果,请大家帮忙看看,谢谢。