| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 518 人关注过本帖
标题:考场安排--代码运行问题。
只看楼主 加入收藏
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
结帖率:95%
收藏
已结贴  问题点数:20 回复次数:8 
考场安排--代码运行问题。
#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);
}

程序运行正确,但无法输出结果。运行后,无任何提示,就一个窗口在那。这是什么原因?还有,我不懂这个程序,或许是程序那里我没看出的所以不知道,但也请你指出来,谢谢。
搜索更多相关主题的帖子: 考场 代码 运行 
2010-05-15 23:16
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
【使用说明】
文件第一行数字表示有几组数据。接下来一行是第一组数据的课程总数N,紧接下来数行是各个学生所选的课程(每个学生所选的课程占一行),以0结束输入,然后是一行空行,以下便是第二组数据,与前描述一样。

悲剧源于生活。
2010-05-15 23:17
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
这些数据我都写入了testArrange.in文件里。但为什么没结果输出?改变testArrange.in为只读文件也不行。

悲剧源于生活。
2010-05-15 23:18
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
可怜坐等讲解。

悲剧源于生活。
2010-05-15 23:54
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
帖子沉了。

悲剧源于生活。
2010-05-16 11:02
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:10 
帮忙顶顶
2010-05-16 11:10
yc2575757
Rank: 7Rank: 7Rank: 7
来 自:北京
等 级:黑侠
威 望:1
帖 子:113
专家分:522
注 册:2010-5-7
收藏
得分:10 
能给个testArrange.in的附件么~~这东西有时要单步调才能出来的~~呵呵,水平有限~~
2010-05-16 11:21
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
样例输入:(以下数据均是文件S7051B.in的内容)
3                                 
5                                            
1 2 5
2 4                                          
1
2
3 5
4 5
3 5
2 3
1 4
2 5
2 4 5
1 3 4
0
 
4
1 2
2 3
3 4
1 4
0
 
4
1
2
3
4
0
我写入数据也没结果输出啊,但是原作者用上面的却得出结果:
Turns:1
    testArrange times:5
    1#:1
    2#:2
    3#:3
    4#:4
    5#:5
Turns:2
    testArrange times:2
    1#:1 3
    2#:2 4
Turns:3
    testArrange times:1
    1#:1 2 3 4

悲剧源于生活。
2010-05-16 12:54
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
我是自己建立一个.in文件,用记事本写入数据。不知道这样可以不可以。

悲剧源于生活。
2010-05-16 12:54
快速回复:考场安排--代码运行问题。
数据加载中...
 
   



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

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