- 论坛徽章:
- 0
|
有些地方可能不对,抛砖引玉
把 东西两岸 写为 此岸,彼岸
渡船中,此岸 最短渡船序列为:
>>>最短渡船序列证明见 30 楼<<<
- //相似的不再列出
- //其中,A、B、C代表母老虎,1、2、3代表小老虎)
- //程序中4、5、6代表母老虎,1、2、3代表小老虎) //上下一一对应
- 序列>
- 00: ABC123
- 01: BC23
- 02: ABC23
- 03: ABC
- 04: ABC1
- 05: A1
- 06: AB12
- 07: 12
- 08: 123
- 09: 1
- 10: 12
复制代码
每次组合变化数序列:
- 00: -2
- 01: 1
- 02: -2
- 03: 1
- 04: -2
- 05: +2
- 06: -2
- 07: 1
- 08: -2
- 09: 1
- 10: -2
复制代码
可见每次变化的规律:此岸组合交替 减2/加1 个元素 (除 05 步加 2,即组合中只有一对母子老虎是加 2)
算法:
>>>主函数<<<:
- i = 0 //全局变量:渡船方法数
- set = "456123" //最初组合
- 递归函数(set)
- print i //打印渡船方法总数
复制代码
>>>递归函数<<<
(
当组合元素个数为 0 时,渡船方法数自加 1(计数),返回;
当组合为安全组合时,调用递归函数;
当组合为非安全组合时,不计数,返回;
)
- //彼岸和此岸互为补集
- f = 0 //变量(标志渡船来回) 0: 渡向彼岸 1:渡向此岸
- set //递归函数形参
- while(组合元素个数不为0)
- do
- if(f == 0) //渡向彼岸,减去两个元素
- for T1, T2 in set
- fun(set, T1, T2, 0) //见下定义
- f = 1
- else //f == 1 渡向此岸,加上一个元素(有特殊情况:组合中只有一对母子老虎加两个元素)
- if(组合中只有一对母子老虎)
- for T1, T2 in mod(set) //set 的补集
- fun(set, T1, T2, 1) //见下定义
- f = 0
- else
- for T in mod(set) //set 的补集
- add(set, T) //与 fun 函数类似,见下定义
- f = 0
- done
- def fun(set, T1, T2, f)
- // when add2 or dev2
- // f 为局部标志 0:dev 2 elements, 1:add 2 elements
- if(f == 0)
- 从组合中减去 T1,T2
- else // f == 1
- 在组合中加上 T1,T2
- if(组合长度为0)
- i++
- return
- if(此岸非安全组合 || 彼岸非安全组合) // call 安检函数 (见下)
- return
- else //安全组合
- call 递归函数(set)
- def add(set, T)
- //when add1
- if(此岸非安全组合 || 彼岸非安全组合) // call 安检函数 (见下)
- return
- else //安全组合
- call 递归函数(set)
复制代码
>>>安检函数<<<
(检测组合是否为安全组合
:
如果有一个子老虎且没有其对应的母老虎,但有其他母老虎
则为非安全组合
)
- d = 0 //标志变量 0:表示 无 母子老虎 n(>0):表示 母子老虎对数
- T //临时变量
- while (组合长度 != 0)
- do
- if(组合元素 有 母子老虎对) //优先 删除 母子老虎对
- d++
- 从组合中 删除 母子老虎对
- elif(组合中都为母老虎)
- return "安全组合"
- elif(组合中都为子老虎 && d == 0)
- return "安全组合"
- else
- return "非安全组合"
- done
复制代码
[ 本帖最后由 爱知 于 2009-1-2 14:46 编辑 ] |
|