[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 【趣味数学】批处理平均倒水问题

可参考这个帖子http://www.cn-dos.net/forum/viewthread.php?tid=42458

[出题]批处理趣味数学之平分水的问题

有一个8升的瓶子装满水,还有一个5升的空瓶子和一个3升的空瓶子。要求将水分成两个4升,请用批处理给出解决方案。

       我平时没事就琢磨琢磨,找出一点不通用的规律 却也有趣,今天是来分享这点小规律的。


且先看4 3 1 的杯子  分 2 2的
a b c
4 0 0     a to b
1 3 0            b to c
1 2 1                   c to a   
2 2 0            

这是短的, 8 5 3 的杯子也类似
a b c
8 0 0     a to b
3 5 0            b to c
3 2 3                   c to a
6 2 0            b to c
6 0 2     a to b
1 5 2            b to c
1 4 3                   c to a
4 4 0

想必这会儿已经看出规律了吧 ,不过像10 7 3 的就不能用这个了,遗憾。


但已知这个方式能解决的例子有[20以内]:
4 3 1   \  8 5 3 \   12 7 5  \ 16 9 7  \  20 11 9

不行的有:6 5  1  \  10 7 3  \  14 9 5  \  18 11 7
  1. @echo off &setlocal enabledelayedexpansion
  2. set /a a=28,b=15,c=13
  3. set /a an=a,bn=0,cn=0,ah=a/2
  4. echo,           %an% --- %bn% --- %cn%
  5. :a
  6.   for %%a in ("a b" "b c" "c a" "b c") do (call :next %%~a)
  7. goto :a
  8. :next
  9. set /a cut=%2 - %2n
  10. if !%1n! gtr %cut% (set /a %1n-=cut,%2n+=cut
  11.             ) else (set /a %2n+=%1n,%1n=0)
  12. echo,%1 to %2 -^>  %an% --- %bn% --- %cn%
  13. if %an%%bn% equ %ah%%ah% pause>nul &exit
复制代码
tab被空格取代了 我还是上传源码txt吧。

虽然不通用,不过算是一点点小小发现,公布一下。

[ 本帖最后由 523066680 于 2009-3-21 15:19 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

继续探索,发现:
    类似有10升  分 5  5升
但是题目如果规定有  10  5+1 5-1 即 10 6  4 升的杯子是不能得到解的  
因为10 6 4 全是偶数 怎么减也不可能减出一个奇数。
所以只能  10   7  3的杯子为题。

根据后面的几个不能用此方法求解的例子,判断:
杯子类型为 2n   n+2   n-2 升杯子 分 n n 的 , 的皆不能用上面的方法解。

不知道还有啥规律没

[ 本帖最后由 523066680 于 2009-3-21 14:54 编辑 ]

TOP

俺将hat的代码进行了修改,想窥探倒水的规律
代码如下:
@echo off
setlocal EnableDelayedExpansion
set x=18
set y=11
set z=7
set a=%x%
set b=0
set c=0
set n=0
:water1
if %a% neq %b% (
  set /a n+=1
  if %b% equ 0 (
    set /a a-=y
    set /a b=y
    set now=a to b
  ) else (
    if %c% equ %z% (
      set /a a+=z
      set c=0
      set now=c to a
    ) else (
      set /a t=z-c
      if %b% gtr !t! (
        set /a b-=t
        set /a c=z
        set now=b to c
      ) else (
        set /a c+=b
        set b=0
        set now=b to c
      )
    )
  )
if defined now (
if "!now:~0,1!"=="a" (echo,!now!)
if "!now:~0,1!"=="b" (echo,     !now!)
if "!now:~0,1!"=="c" (echo,          !now!)
)
  goto :water1
)
pause

TOP

返回列表