人狼羊菜2018年过程版本

分析

假设开始人狼羊菜都是在A岸,目的是将人狼羊菜运输到B岸。
人,狼,羊,菜在A岸的标识为0,在B岸的标识位为1。经过枚举可以得出16种状态中不符合的有6种。
如图所示

人狼羊菜状态图

根据以上描述的状态模式,可以将问题转化为

  • 判断运输的终止状态是否合法
  • 判断人和羊是否在一侧
  • 判断人和菜是否在一侧
  • 判断人和狼是否在一侧
  • 执行人独自过河的动作
  • 执行人和羊一起过河的动作
  • 执行人和狼一起过河的动作
  • 执行人和菜一起过河的动作

新建MoveClass类

1
2
3
4
5
6
7
/// <summary>
/// 人狼羊菜运输类
/// </summary>
public class MoveClass
{

}

依次对应的函数如下

1
2
3
4
5
6
7
8
9
/// <summary>
/// 状态合法
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public bool IsVaild(int state)
{
return state != 3 && !(state >= 6 && state <= 9) && state != 12;
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人和羊在一起返回真
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public bool IsPeopleWithSheep(int state)
{
return ((state / 2) % 2 == 0 && state < 8) || ((state / 2) % 2 == 1 && state >= 8);
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人和菜在一起返回真
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public bool IsPeopleWithGreens(int state)
{
return state % 2 == 0 && state < 8 || state % 2 == 1 && state >= 8;
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人和狼在一起返回真
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public bool IsPeopleWithWolf(int state)
{
return !(state >= 4 && state <= 11);
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 只身一人过河
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public int MovePerson(int state)
{
return state ^ 8;
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人带羊过河
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public int MovePersonWithSheep(int state)
{
return state ^ 10;
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人带狼过河
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public int MovePersonWithWolf(int state)
{
return state ^ 12;
}
1
2
3
4
5
6
7
8
9
/// <summary>
/// 人带菜过河
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public int MovePersonWithGreens(int state)
{
return state ^ 9;
}

主要的逻辑函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public void Move()
{
int state = 0, tempState;
int EndState = 15;
while (state != EndState)
{
tempState = MovePerson(state);
if (IsVaild(tempState))
{
state = tempState;
Console.WriteLine(state > 8 ? "人独自一人从A岸到达B岸" : "人独自一人从B岸到达A岸");
}

if (IsPeopleWithSheep(state))
{
tempState = MovePersonWithSheep(state);
if (IsVaild(tempState))
{
state = tempState;
Console.WriteLine(state > 8 ? "人带羊从A岸到达B岸" : "人带羊从B岸到达A岸");
}
}

if (IsPeopleWithWolf(state))
{
tempState = MovePersonWithWolf(state);
if (IsVaild(tempState))
{
state = tempState;
Console.WriteLine(state > 8 ? "人带狼从A岸到达B岸" : "人带狼从B岸到达A岸");
}
}

if (IsPeopleWithGreens(state))
{
tempState = MovePersonWithGreens(state);
if (IsVaild(tempState))
{
state = tempState;
Console.WriteLine(state > 8 ? "人带菜从A岸到达B岸" : "人带菜从B岸到达A岸");
}
}
}
}

执行以上逻辑函数

1
2
3
4
Console.WriteLine("MoveClass 开始");
new MoveClass().Move();
Console.WriteLine("MoveClass 结束");
Console.ReadKey();

最终运行结果如下:

1
2
3
4
5
6
7
8
9
MoveClass 开始
人带羊从A岸到达B
人独自一人从B岸到达A
人带狼从A岸到达B
人带羊从B岸到达A
人带菜从A岸到达B
人独自一人从B岸到达A
人带羊从A岸到达B
MoveClass 结束

参考资料

作者

stone liu

发布于

2018-10-30

更新于

2024-09-06

许可协议

评论