考场安排--代码运行问题。
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define MAX 10
int value[MAX],result[MAX],test[MAX][MAX],N,minSum=0;
void init(FILE *fp)//从文件读记录,并建立与课程相对应的邻接矩阵
{
int a[MAX],t,j,i=0;
char str[50],*p;
memset(test,0,sizeof(test));
fscanf(fp,"%d",&N);
minSum=N;
fseek(fp,2,1);
fgets(str,50,fp);
p=str;
while(1)
{
while(*p!='\n')
a[i++]=(int)strtol(p,&p,10);
if(a[0]==0)
break;
for(j=0;j<i;j++)
for(t=j+1;t<i;t++)
test[a[j]][a[t]]=test[a[t]][a[j]]=1;
i=0;
fgets(str,50,fp);
p=str;
}
}
int count(int *count,int k)//对以生成的解进行统计,以便剪枝
{
int i,j,n=0;
for(i=1;i<=k;i++)
{
for(j=i+1;j<=k;j++)
if(count[j]==count[i])
break;
if(j==k+1)
n++;
}
return(n);
}
int nextValue(int k)//生成下一个解
{
int j,n=0;
while(1)
{
value[k]=(value[k]+1)%(N+1);
if(value[k]==0)
return 0;
for(j=1;j<=N;j++)//对生成的解进行合法性检查
{
if((test[j][k]==1)&&(value[k]==value[j]))
break;
}
if(j==N+1)
{
return 0;
}
}
}
int testArrange(int k )//找一个图的考试方案
{
int j,t;
while(1)
{
nextValue(k);
if(value[k]==0)
return 0;
j=count(value,k);
if(j>minSum)
{ //如果目前生成解的总数以大于以前生成解的总数,则进行剪枝,并回溯
for(t=k+1;t<=N;t++)
value[t]=0;
continue;
}
if(k==N)
{
if(j<minSum)//记录最少的考试场数
{
minSum=j;
for(t=1;t<=N;t++)
result[t]=value[t];//记录最优解
}
}
else
testArrange(k+1);//递归调用
}
}
void print(int min)//打印考试场次安排
{
int i,t,k,j=1;
if(min==1)//只需一个场次
{
printf(" %d#:",j);
for(i=1;i<=N;i++)
printf("%d ",i);
printf("\n");
}
else if(min==N)//一门一个场次
{
for(i=1;i<=N;i++)
printf(" %d#:%d\n",i,i);
}
else//其他情况
{
for(t=1;t<=N;t++)
{
i=result[t];
if(i!=0)
{
printf(" %d#:",j++);
for(k=t;k<=N;k++)
{
if(result[k]==i)
{
printf("%d ",k);
result[k]=0;
}
}
printf("\n");
}
}
}
}
void main()
{
FILE *fp;
int n,i;
if((fp=fopen("testArrange.in","r"))==NULL)
{
printf("File cann't open!");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
{
init(fp);
memset(value,0,sizeof(value));
testArrange(1);
printf("Turns:%d\n testArrange times:%d\n",i+1,minSum);
print(minSum);
fseek(fp,2,1);
}
fclose(fp);
}
程序运行正确,但无法输出结果。运行后,无任何提示,就一个窗口在那。这是什么原因?还有,我不懂这个程序,或许是程序那里我没看出的所以不知道,但也请你指出来,谢谢。