感谢Bloodblaze提供的一道简单的题目。以下是一个使用Fortran90进行DFS遍历的例子。具体题面稍后再说。
感谢Wikibooks和StackOverflow。如果没有他们,我是不可能在一夜之间入门Fortran的;-)
另外,我在网上找到了这些资源可供参考:
- http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/
- https://web.stanford.edu/class/me200c/tutorial_90/
本以为总算可以可以早点去睡觉的,结果发现根本停不下来。这里就不得不提到编程过程中的一大错觉:
再写半个小时应该就能完工了。
我在1点的时候也是这么想的。
我可能是阿华田喝多了。
以及这里的代码高亮似乎并不支持Fortran……
PROGRAM test
IMPLICIT NONE
INTEGER, PARAMETER :: STUDENT_COUNT = 7
INTEGER, PARAMETER :: MAX_VACANCY = 3
INTEGER, DIMENSION(STUDENT_COUNT, MAX_VACANCY) :: VACANCY
INTEGER, DIMENSION(STUDENT_COUNT) :: schedule = 0
INTEGER :: solutionCount = 0
VACANCY = transpose(reshape( &
(/2,4,0, &
1,6,0, &
3,7,0, &
5,0,0, &
1,4,6, &
2,5,0, &
3,6,7/), &
(/MAX_VACANCY, STUDENT_COUNT/)))
!write(*,*) VACANCY(2,3)
CALL assignStudent(1)
WRITE(*,*) "Solutions: ", solutionCount
CONTAINS
RECURSIVE SUBROUTINE assignStudent(studentIndex)
INTEGER, INTENT(IN) :: studentIndex
INTEGER :: i, j, vc
TEST_VACANCY: DO i = 1,MAX_VACANCY
vc = VACANCY(studentIndex, i)
IF (vc == 0) EXIT TEST_VACANCY
! sanity check
DO j = 1,studentIndex - 1
! DOW is occupied
IF (schedule(j) == vc) CYCLE TEST_VACANCY
END DO
! so far, so good
schedule(studentIndex) = vc
IF (studentIndex >= STUDENT_COUNT) THEN
! the solution is complete
DO j = 1, STUDENT_COUNT
write(*,"(I4)",advance="no") schedule(j)
END DO
write(*,*)
solutionCount = solutionCount + 1
CYCLE TEST_VACANCY
END IF
! the solution is not complete
! go to next level
CALL assignStudent(studentIndex + 1)
END DO TEST_VACANCY
END SUBROUTINE assignStudent
END PROGRAM test
运行结果如下
root@localhost:/usr/local/fortran# gfortran test.f90 root@localhost:/usr/local/fortran# ./a.out 4 1 3 5 6 2 7 4 1 7 5 6 2 3 4 6 3 5 1 2 7 4 6 7 5 1 2 3 Solutions: 4 root@localhost:/usr/local/fortran#

