[Fortran] 纯文本查看 复制代码
program main
implicit none
Integer , parameter :: NDay = 7 ! 7 天
Integer , parameter :: NMan = 7 ! 7 个人
logical :: bIdle(NMan,NDay) = reshape( ((/0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,1,0,1&
,0,0,1,0,0,1,0,1,0,0,1,0,0,0,1/)==1) , (/NMan,NDay/) )
integer :: arrange(NDay) , nArrg = 0 ! 当前的安排,有效的安排个数
arrange(:) = 0
call sub1( arrange , 1 ) ! 安排第一天
print * , nArrg
contains
recursive subroutine sub1( arr , iDay )
implicit none
integer , intent( IN ) :: iDay
integer , intent( INOUT ) :: arr(:)
integer :: i
Do i = 1 , NMan
if ( bIdle(i,iDay) .and. & ! 如果该人该天有空
( all(arr(1:iDay)/=i) ) & ! 且以前没安排过该人
) then
arr(iDay) = i ! 当天安排该人
If ( iDay < NDay ) then ! 如果没安排完
call sub1( arr , iDay+1) ! 安排下一天
Else ! 否则安排完了
write(*,"(7i2)") arr(:) ! 输出
nArrg = nArrg + 1 ! 合理安排个数 + 1
End If
arr(iDay) = 0 ! 取消该天安排,以便列举安排其他人的情况
end if
End Do
end subroutine
end program main