Fortran Coder

查看: 7414|回复: 5
打印 上一主题 下一主题

[通用算法] 值日分配安排问题的逻辑

[复制链接]

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
楼主
发表于 2014-11-29 10:36:55 | 显示全部楼层
我愣是没看懂楼主的需求?要实现什么呢?建议楼主再详细描述一下。

PS:楼主那七段 if  if  call  完全可以用 do  循环实现的。

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
沙发
发表于 2014-11-29 11:56:12 | 显示全部楼层
本帖最后由 百事可乐 于 2014-11-29 12:02 编辑

我觉得吧,你不应该对 lg 数组进行修改.这是原始数据啊....输出的时候,也不应该输出 lg

下面的代码不知道是不是你想要的意思?

[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


输出 4 种安排,每一行表示一种安排,7个数字代表7天,每个数字表示该天由几号学生值日。
2 6 3 1 4 5 7
2 6 7 1 4 5 3
5 6 3 1 4 2 7
5 6 7 1 4 2 3
           4

评分

参与人数 2F 币 +18 贡献 +18 收起 理由
306908677 + 9 + 9 赞一个!
fcode + 9 + 9 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-4 10:21

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表