本程序使用递归算法,定义二维数组int a[N][4]存储每一步中各个事物所处的位置。二维数组的一维下标表示当前进行的步骤,第二维下标可能的取值为0〜3,在这里规定它与四种事物的具体对应关系为:0——狼、1——羊、2——白菜、3——农夫。接着再将东岸和西岸数字化,用0表示东岸,1表示西岸,该信息存储在二维数组的对应元素中。
定义Step变量表示渡河的步骤,则成功渡河之后,a数组中的存储状态为:
a[Step][0] 1
a[Step][1] 1
a[Step][2] 1
a[Step][3] 1
因为成功渡河后,狼、羊、白菜和农夫都在河的西岸,因此有:
a[Step][0]+a[Step][1]+a[Step][2]+a[Step][3]=4
题目中要求狼和羊、羊和白菜不能在一起,因此若有下述情况出现:
a[Step][1]!=a[Step][3] && (a[Step][2]==a[Step][1] || a[Step][0]=a[Step][1])
则发生错误,应返回操作。
在程序实现时,除了定义a数组来存储每一步中各个对象所处的位置以外,再定义一维数组b[N]来存储每一步中农夫是如何过河的。
程序中实现递归操作部分的核心代码为:
for(i=-1; i<=2; i++)
{
b[Step]=i;
memcpy(a[Step+1], a[Step], 16); /*复制上一步状态,进行下一步移动*/
a[Step+1][3]=1-a[Step+1][3]; /*农夫过去或者回来*/
if(i == -1)
{
search(Step+1); /*进行第一步*/
}
else
if(a[Step][i] == a[Step][3]) /*若该物与农夫同岸,带回*/
{
a[Step+1][i]=a[Step+1][3]; /*带回该物*/
search(Step+1); /*进行下一步*/
}
}