如何解决这个关于毕业的算法难题

时间:2015-06-07 01:26:06

标签: java algorithm graph-algorithm

我试图用java解决这个编程问题:

  

描述

     

一名未来的CS学生正在调查从各种不同的大学毕业需要多少个学期。每   大学提供必修课程清单,其先决条件,   当提供每门课程时。鉴于此信息,确定   最低学期毕业。

     

考虑以下示例。学生必须参加4门课程,mt42,cs123,cs456和cs789。 mt42仅在   秋季学期并没有先决条件。同样,cs123只是   在春季学期提供,没有先决条件。 cs456只是   在春季学期提供,并有cs123和mt42   先决条件。最后,cs789在秋季和春季提供   将cs456作为唯一的先决条件。毕业的最短时间是5   学期,在秋季采取mt42,在明年春天cs123,cs456   接下来的春天(因为它不是在秋季提供),最后   cs789接下来的秋天。

     

对于这个问题,只有两个学期,秋季和春季。始终从秋季开始计算学期。

     

除了跌倒/弹簧调度问题外,还有一个小问题。每个人都要保持宿舍满员   大学限制任何可以参加的课程数量   学期。此限制显示为输入数据的一部分。第三   下面的例子说明了这个问题。

     

输入

     

有一到二十五个数据集,后面跟着一个只包含整数-1 -1的最后一行。数据集以一行开头   包含两个正整数n,1< = n< = 12,这是数字   该数据集中的课程和m,2< = m< = 6,这是最大值   任何一个学期都可以参加的课程数量。下一个   line包含n个课程标识符。每个都是1-5个字符的字符串   来自集合{a-z,0-9}。课程标识符之后是   个别课程信息。它由n行组成,一行为   每门课程,包含课程标识,提供学期   ('F'=秋天,'S'=春天,'B'=两个学期),先决条件的数量   课程,p,0< = p< = 5,最后是前提课程   身份标识。下面的第一个示例数据集对应于   问题如上所述。

     

输出

     

每个数据集的输出包含一行,格式如示例输出所示。

     

示例输入

4 6
cs123 mt42 cs456 cs789
mt42 F 0
cs123 S 0
cs456 S 2 cs123 mt42
cs789 B 1 cs456
3 6
math1 comp2 comp3
comp3 S 1 comp2
math1 S 0
comp2 F 1 math1
4 3
m10 m20 c33 c44
m10 B 0
m20 B 0
c33 B 0
c44 B 0
-1 -1
     

示例输出

The minimum number of semesters required to graduate is 5.
The minimum number of semesters required to graduate is 4.
The minimum number of semesters required to graduate is 2.

我试图用java解决它而没有找到如何继续的方法。任何想法我怎么能轻松做到这一点。我看的AC率是50%。我担心我错过了一个简单的方法。这是我的代码:

String output="The minimum number of semesters required to graduate is ";
    Scanner sc=new Scanner(System.in);
    int totalcourse=sc.nextInt();
    int maxcourse=sc.nextInt();
    int semester=0;
    HashMap<String, List<String>> preqcourses=new HashMap<String, List<String>>();
    boolean fall=true;
    ArrayList<String> courses=new ArrayList<String>();
    for(int i=0;i<totalcourse;i++)
    {
        courses.add(sc.next());         
    }
    for(int c=0;c<totalcourse;c++)
    {
        String course=sc.next();
        String osem=sc.next();
        int prereq=sc.nextInt();
        String [] coursearr=new String[prereq];
        //populating prereq course array
        for(int p=0;p<prereq;p++)
        {
            coursearr[p]=sc.next();
        }
        preqcourses.put(course, Arrays.asList(coursearr));  // Adding prerequisite courses to hashmap               
        if(fall)
        {
            if((osem.equals("F")|| osem.equals("B"))&& prereq==0)
            {
                courses.remove(course);

                semester++;
            }
            if((osem.equals("F")|| osem.equals("B"))&& preqcourses.get(course).size()>0)
            {
                for(int q=0;q<preqcourses.get(course).size();q++)
                {
                    if(!courses.contains(preqcourses.get(course).get(q)))
                    {
                        preqcourses.get(course).remove(preqcourses.get(course).get(q));
                        prereq--;
                    }
                }
            }
            fall=!fall;

        }
    }


}

由于它变得复杂并且认为有一些简单的解决方案,我无法继续前进。

1 个答案:

答案 0 :(得分:0)

拓扑排序,以获取详细说明先决条件的图形,然后从起始节点获取dfs,以获得所需的学期数