C语言编程过河问题,求解:过河有关问题

C/C++ code#include

char *name[] = {"农夫","狼","羊","菜"};

char *name1[] = {"去对岸","回本岸"};

struct way

{

int num;//农夫带走的东西 包括他自己

bool go_back;//带到那里去0表示去对岸 1表示会本岸

};

bool now[4] = {0};//当前状态0表示在本岸1表示在对岸

bool foot[2][2][2][2] = {0};//状态标记表

bool Kill(bool a,bool b,bool c,bool d)//判断是否会吃掉

{

if((c == b && a != c) || (d == c && a != c))

return true;

return false;

}

bool dfs(way w[],int sumway,bool now[])

{

if(4 == now[0]+now[1]+now[2]+now[3])//如果都在对岸

{

for(int i = 0;i

printf("农夫带着%s%s\n",name[w[i].num],name1[w[i].go_back]);

printf("\n\n");

return true;

}

int i;

if(0 == now[0])//如果农夫在本岸

{

for(i = 0;i<4;i++)//遍历他所能带走的东西(包括带走他自己)

{

if(0 == now[i])

{

now[0] = now[i] = 1;//试探

if(!foot[now[0]][now[1]][now[2]][now[3]])//判断

{

if(!Kill(now[0],now[1],now[2],now[3]))

{

foot[now[0]][now[1]][now[2]][now[3]] = true;//试探

w[sumway].num = i; w[sumway++].go_back = 0;//记录路径

dfs(w,sumway,now);//继续搜索

foot[now[0]][now[1]][now[2]][now[3]] = false;//回溯

sumway--;

}

}

now[0] = now[i] = 0;//回溯

}

}

return false;

}

else //如果农夫在对岸 下面注释同上

{

for(i = 0;i<4;i++)

{

if(1 == now[i])

{

now[0] = now[i] = 0;

if(!foot[now[0]][now[1]][now[2]][now[3]])

{

if(!Kill(now[0],now[1],now[2],now[3]))

{

foot[now[0]][now[1]][now[2]][now[3]] = true;

w[sumway].num = i; w[sumway++].go_back = 1;

if(dfs(w,sumway,now))

return true;

foot[now[0]][now[1]][now[2]][now[3]] = false;

sumway--;

}

}

now[0] = now[i] = 1;

}

}

return false;

}

}

int main()

{

way w[100] = {0};

dfs(w,0,now);

return 0;

}

------解决方案--------------------

action_init();

要放在 createG(); 前

这样矩阵就有内容了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值