标题: 出题:科克曼女生问题
[打印本页]
作者: 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 ]