Board logo

标题: 出题:科克曼女生问题 [打印本页]

作者: WANKOILZ     时间: 2008-6-22 20:32    标题: 出题:科克曼女生问题

不知道有没有人做过:
有 15 个女生,她们每天早晨都 3人一组 地散步(15个人每天同时去)。现在要求在一周内她们任意两人之间只能碰一次面,请列出每天的分组情况。用bat做出来。

答案见10楼 和 13楼。

───────────────── 版务记录 ─────────────────
执行:HAT
操作:[2008-11-10]在帖子标题中增加搜索关键字
说明:原标题"出一道题"不利于论坛搜索
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2008-11-10 at 14:35 ]
作者: bat-zw     时间: 2008-6-22 21:58
不知道考虑全了没:
@echo off&setlocal enabledelayedexpansion
set code=abcdefghijklmnop&set num=15
:lp
set /a a=%random%%%%num%
set a=!code:~%a%,1!
set str=%str%%a%
set code=!code:%a%=!
set /a num-=1
set /a n+=1
if %n% lss 2 goto lp
set codes=%code%
set /a a=%random%%%num%
set a=!codes:~%a%,1!
set str=%str%%a%
set /a m+=1,n=0
echo 星期%m%:%str%
if %m% lss 7 set str=&goto lp
pause>nul
[ Last edited by zw19750516 on 2008-6-22 at 10:07 PM ]
作者: WANKOILZ     时间: 2008-6-22 22:00
to zw:
15个女生每天要同时出现哦。
作者: terse     时间: 2008-6-23 11:34
一周 除去休息日不
作者: WANKOILZ     时间: 2008-6-23 17:18
一周7天。
作者: terse     时间: 2008-6-23 23:08
现在才知道  著名的科克曼女生问题
作者: 26933062     时间: 2008-6-24 16:44
有个疑惑,有这样的组合吗?
我手工排都没排出来,只排出4天的。
楼主能给个结果出来吗?
作者: terse     时间: 2008-6-24 17:47
排5天可以  但这个科克曼女生问题可以解决 P就很难
搞到5天
@echo off&setlocal enabledelayedexpansion
set str1=ABCDE
set str2=FGHIJ
set str3=KLMNO
:lp
for /l %%i in (0 1 4) do (
for /l %%i in (0 1 4) do set/p =!str1:~%%i,1!!str2:~%%i,1!!str3:~%%i,1! <nul
echo.
set str2=!str2:~1!!str2:~,1!
set str3=!str3:~2!!str3:~,2!
)
pause

[ Last edited by terse on 2008-6-24 at 05:50 PM ]
作者: WANKOILZ     时间: 2008-6-24 18:26
to 7楼 : 手工答案是有的,下次有空发上来
至于P,我也弄不出完整答案,只能做到把15人分成35组,两两只向遇一次。却不能完全分组,哎.........,期待有人弄出来。下面是我的.很臃肿....:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,13) do (
  set/a num1=%%i+1
  for /l %%j in (!num1!,1,14) do (
    set/a num2=%%j+1
    for /l %%k in (!num2!,1,15) do (
    call :out %%i %%j %%k
    )
  )
)
echo 一共%num%组&echo.&echo 分组排列情况如下:
:loop
for /f "tokens=1 delims=-=" %%i in ('set -') do (
  set flag=0
  for %%j in (%%i) do (
  if not defined .%%j set/a flag+=1
  )
  if !flag!==3 (set/p=%%i  <nul&set -%%i=&for %%j in (%%i) do (set .%%j=ok))
)
echo.&for /l %%i in (1,1,15) do set .%%i=
set/a flag1+=1&if not !flag1!==7 goto :loop
echo.&echo 未能加入分组的项目:
set -
pause>nul

:out
set flag=0
for %%i in (%1 %2 %3) do (
  for %%j in (%1 %2 %3) do (
  if not %%i==%%j if not defined %%i_%%j set/a flag+=1)
  )
)
if %flag% lss 6 goto :eof
set/a num+=1&echo %1-%2-%3&set -%1,%2,%3=ok
for %%i in (%1 %2 %3) do (
  for %%j in (%1 %2 %3) do (
  if not %%i==%%j set %%i_%%j=ok
  )
)

作者: 26933062     时间: 2008-6-25 05:29
真是无心插柳柳成阴,在绝望的时候乱来一气,居然成了。。。
代码中的大写那一行可谓神来之笔,也是无意所得。正宗的瞎猫遇到死耗子。。呵呵。。
初步测试好像是没问题,欢迎大家测试。。
@echo off&setlocal enabledelayedexpansion
set "var1=a b c d e f g h i j k l m n o"
for %%a in (一 二 三 四 五 六 日) do (
    set /a xx+=1&set ".!xx!=%%a"
)
for %%a in (!var1!) do (
   set "var2=!var1:%%a=!"
   for %%b in (!var2!) do (
      set "var3=!var2:%%b=!"
      for %%c in (!var3!) do (
         if not defined %%a.%%b if not defined %%b.%%a (
            if not defined %%a.%%c if not defined %%c.%%a (
               if not defined %%b.%%c if not defined %%c.%%b (
               set "num=%%a.%%b %%b.%%a %%a.%%c %%c.%%a %%b.%%c %%c.%%b"
               for %%i in (!num!) do set %%i=a
               set /a nnn+=1
               set "..%%a=!..%%a! %%a-%%b-%%c"
))))))
FOR %%B IN (!..A!) DO SET "..A2=%%B !..A2!"
echo  !..A2!
for %%a in (b c d e f g) do echo !..%%a!
echo  共 !nnn! 组
echo.&echo.
for %%a in (!..a2!) do (
   set "str=%%a"
   set /a xq+=1
   for %%c in (b c d e f g) do call :loop %%c
   call echo  星期%%.!xq!%%   %%a!max!
   set "max="
)
echo.&pause
:loop
set "str=!str! !max!"
set "str=!str:-= !"
for %%d in (!..%1!) do (
   set "num=%%d"
   for %%e in (!str!) do set "num=!num:%%e=!"
   if not "!num:~4,1!"=="" (
      set "max=!max! %%d"
      set "..%1=!..%1:%%d=!"
      goto :eof
))
goto :eof
[ Last edited by 26933062 on 2008-6-25 at 08:02 AM ]
作者: WANKOILZ     时间: 2008-6-25 12:36
楼上的测试没问题,而且代码很NB。不知道我的为什么分组不成功............
作者: bat-zw     时间: 2008-6-25 12:48
高,好高,确实高,实在是高,不可谓不高,惊世骇俗的高!
学,真学,仔细学,虚心求学,扎扎实实学,永无止境地学。
作者: WANKOILZ     时间: 2008-6-25 13:41
我欲哭无泪,在看了 26933062兄 的代码后终于发现之所以排列不成功是因为set -这句的输出顺序不对头。换了一下set的顺序(sort/r)后,惊奇地发现可以了,真是神奇,我郁闷很久了.......:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,13) do (
  set/a num1=%%i+1
  for /l %%j in (!num1!,1,14) do (
    set/a num2=%%j+1
    for /l %%k in (!num2!,1,15) do (
    call :out %%i %%j %%k
    )
  )
)
echo.&echo 一共%num%组&echo.&echo 分组排列情况如下:
for /f "tokens=1 delims=-=" %%i in ('set -01^|sort/r') do (
  set/p=%%i  <nul&set -%%i=&for %%j in (%%i) do (set .%%j=ok)
  for /f "tokens=1 delims=-=" %%j in ('set -') do (
  set flag=0
  for %%k in (%%j) do if not defined .%%k set/a flag+=1
  if !flag!==3 (set/p=%%j  <nul&set -%%j=&for %%k in (%%j) do (set .%%k=ok))
  )
  echo.&for /l %%i in (1,1,15) do (set str=0%%i&set str=!str:~-2!&set .!str!=)
)

pause>nul

:out
set flag=0
for %%i in (%1 %2 %3) do (
  for %%j in (%1 %2 %3) do (
  if not %%i==%%j if not defined %%i_%%j set/a flag+=1)
  )
)
if %flag% lss 6 goto :eof
set/a num+=1
set str1=0%1&set str2=0%2&set str3=0%3&set str1=!str1:~-2!&set str2=!str2:~-2!&set str3=!str3:~-2!
echo !str1!-!str2!-!str3!&set -!str1!,!str2!,!str3!=ok
for %%i in (%1 %2 %3) do (
  for %%j in (%1 %2 %3) do (
  if not %%i==%%j set %%i_%%j=ok
  )
)
[ Last edited by WANKOILZ on 2009-7-29 at 02:43 ]