用C语言解决狼羊白菜过河的思路,基于visual Studio2013解决C语言竞赛题之1089牛虎过河...

/************************************************************************/

/*

89.牛虎同渡问题。

三只牛和三只虎渡河,船只能容1至2只牛和虎(牛和虎各一只、单独一只牛或虎、或两只同类)。

任一岸边若虎多于牛则虎会吃牛,问怎样才能使牛不被伤害而安全过河。

*/

/************************************************************************/

#include

#include

static int num=0;

bool IsSafe89(int *arr)

{

if (arr[1]!=0&&arr[0]!=0&&arr[0]

{

return false;

}

else

return true;

}

void printfarr89(int *arr)

{

for (int i=0;i<3;i++)

{

printf("%5d",arr[i]);

}

}

//i=0 代表1牛一虎 1代表 一牛 2 代表 1虎 3代表 二牛 4 代表 二虎

boolMove(int *farr,int*tarr,int h,int zs)//h表示方向 1表示A-B 0 表示B-A zs 表示这次送过去的标号

{bool isfound=false;

if (h&&tarr[0]==3&&tarr[1]==3||!h&&farr[0]==3&&farr[1]==3)

{

printf("结束了");

printf("\n\n\n\n\n");

isfound=true;

}

else

{

for (int i=0;i<5;i++)

{

if (i==zs)

continue;

#pragma region 条件匹配

if (i==0)

{

if (farr[0]>=1&&farr[1]>=1)

{

farr[0]--;

farr[1]--;

tarr[0]++;

tarr[1]++;

}

else

continue;

}

if (i==1)

{

if (farr[0]>=1)

{

farr[0]--;

tarr[0]++;

}

else

continue;

}

if (i==2)

{

if (farr[1]>=1)

{

farr[1]--;

tarr[1]++;

}

else

continue;

}

if (i==3)

{

if (farr[0]>=2)

{

farr[0]=farr[0]-2;

tarr[0]=tarr[0]+2;

}

else

continue;

}

if (i==4)

{

if (farr[1]>=2)

{

farr[1]=farr[1]-2;

tarr[1]=tarr[1]+2;

}

else

continue;

}

#pragma endregion 条件匹配

if (h==0)

{printf("反反");

}

printf("移动%d\n",i);

if (IsSafe89(farr))

{

if (IsSafe89(tarr)&&h)

{

isfound=Move(farr,tarr,h,i);

}

else

{

isfound=Move(tarr,farr,!h,i);

}

if (!isfound)

{

#pragma region 条件匹配1

if (i==0)

{

farr[0]++;

farr[1]++;

tarr[0]--;

tarr[1]--;

}

if (i==1)

{

farr[0]++;

tarr[0]--;

}

if (i==2)

{

farr[1]++;

tarr[1]--;

}

if (i==3)

{

farr[0]=farr[0]+2;

tarr[0]=tarr[0]-2;

}

if (i==4)

{

farr[1]=farr[1]+2;

tarr[1]=tarr[1]-2;

}

#pragma endregion 条件匹配1

printf("不符合条件回退");

}

}

else

{

#pragma region 条件匹配1

if (i==0)

{

farr[0]++;

farr[1]++;

tarr[0]--;

tarr[1]--;

}

if (i==1)

{

farr[0]++;

tarr[0]--;

}

if (i==2)

{

farr[1]++;

tarr[1]--;

}

if (i==3)

{

farr[0]=farr[0]+2;

tarr[0]=tarr[0]-2;

}

if (i==4)

{

farr[1]=farr[1]+2;

tarr[1]=tarr[1]-2;

}

#pragma endregion 条件匹配1

printf("不符合条件回退%d\n",i);

}

}

}

return isfound;

}

void main()

{printf("i=0 代表1牛一虎 1代表 一牛 2 代表 1虎 3代表 二牛 4 代表 二虎\n");

int arr1[2]={3,3};

int arr2[2]={0,0};

Move(arr1,arr2,1,-1);

printf("asdasfdsf");

system("pause");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值