回溯算法在寻找gradle生最低学期数中的应用

在此处输入图像描述 我正在从包含的文件中获取输入

  1. 每学期没有课程和最多允许课程
  2. 所有课程名称(最多5个字母数字)
  3. couse name,提供的sem,先决条件,Prereq课程。
  4. -1和-1结尾输出将是完成所有课程的最小学期数。

这是我的代码,所以你知道我已经完成了工作。 我的代码正在编译和执行,但没有显示完成课程的sems数。 请告诉我我在哪里做错了

#include #include #include #include #include char garbage[12][6]; char courseIdentifier[12][6],prereqIdentifier[12][5][6]; char semOffered[12]; bool done[12]; bool allDone(int); bool donePrereq(int,int); int main(void) { FILE *fp; fp = fopen("graduate.in","r"); int n,m,p; int i,j,k; for(i=0;i<12;i++) { strcpy(courseIdentifier[i],""); } for(i=0;i<12;i++) { for(j=0;j<5;j++) { strcpy(prereqIdentifier[i][j],""); } } fscanf(fp,"%d %d",&n,&m);// take n,m while(n != -1) { if( !(1<=n && n<=12) || !(2<=m && m<=6) ) { printf("Wrong input"); } for(i=0;i<n;i++) //the list of offered courses { fscanf(fp,"%s",garbage[i]); } for(i=0;i<n;i++) { fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);//the name of course, sem,no. of prereqs for(j=0;j<p;j++) { fscanf(fp,"%s",prereqIdentifier[i][j]); } } int sem=1; char semNow = 'F'; for(i=0;i<n;i++) { done[i]=false; } while(!allDone(n)) { int count=0; //while(count<=m) //{ for(i=0;i<n;i++) { if( (semOffered[i]==semNow || semOffered[i]=='B') && donePrereq(p,n)) { done[i] = true; count++; } } //} sem++; if(semNow=='F') { semNow='S'; } else if(semNow=='S') { semNow='F'; } } printf("minimum number of semesters = %d\n",sem); fscanf(fp,"%d %d",&n,&m);// take n,m } return 1; } bool allDone(int n) { bool returnBool=true; int i; for(i=0;i<n;i++) { returnBool = returnBool && done[i]; } return returnBool; } bool donePrereq(int p,int n) { bool returnBool=true; int i,j; for(i=0;i<p;i++) { for(j=0;j<n;j++) { if(strcmp(prereqIdentifier[i][j],courseIdentifier[j]) ==0 ) { printf("prereq matched\n"); returnBool = (returnBool&&done[j]); } } } return returnBool; } 

当您在此处扫描输入以获取有关每个提供的课程的信息时:

  fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p); 

&semOffered参数不正确。 您需要提供指向char的指针。 由于semOffered是一个char数组,因此您可能希望将其存储到索引位置:

  fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered[i],&p); 

这不会修复您的程序,但它确实允许程序完成。