牧师和野人过河的问题,请高手指点我的程序错误(cpp&python)

hugsnow 2008-07-09 01:09:16
CPP 代码

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;
bool ok(int a,int b);
bool guoqu(int a,int b,vector < int > c);
bool guolai(int a,int b,vector < int > c);
const int ren=3;
const int sheep=3;
int main(int argc, char **argv)
{
vector < int > v;
v.push_back(33);
guoqu(3,3,v);
system("pause");
return 0;
}
bool guoqu(int a,int b,vector < int > c){
//if(a==0&&b==0)
// return true;
for(int i=0;i<=a;i++)
for(int j=0;j<=b;j++)
if(i+j>0&&i+j<=sheep){
int a1,b1,a2,b2,d;
a1=a-i;
b1=b-j;
a2=ren-a1;
b2=ren-b1;
d=a1*10+b1;
if(find(c.begin(),c.end(),d)==c.end()&&ok(a1,b1)){
c.push_back(d);
if(guolai(a2,b2,c)){
cout<<c.size()-1<<".运"<<i<<"牧师和"<<j<<"野人过去,"
<<"这边"<<a1<<b1<<",那边"<<a2<<b2<<endl;
return true;
}
}
}
return false;
}
bool guolai(int a,int b,vector < int > c){
if(a==3&&b==3)
return true;
for(int i=0;i<=a;i++)
for(int j=0;j<=b;j++)
if(i+j>0&&i+j<=sheep){
int a1,b1,a2,b2,a3,b3,d;
a1=a-i;
b1=b-j;
a2=ren-a1;
b2=ren-b1;
d=a2*10+b2;
if(find(c.begin(),c.end(),d)==c.end()&&ok(a2,b2)){
c.push_back(d);
if(guoqu(a2,b2,c)){
cout<<c.size()-1<<".运"<<i<<"牧师和"<<j<<"野人过来,"
<<"这边"<<a2<<b2<<",那边"<<a1<<b1<<endl;
return true;
}
}
}
return false;
}

bool ok(int a,int b){
return a==3||a==0||a==b;
}

Python 代码:

ren=3;
chuan=2;
def ok(a,b):
(a==3) or (a==0) or (a==b)

def guoqu(a,b,c):
for ms in range(a+1):
for yr in range(b+1):
if (ms+yr>0) and (ms+yr<=chuan):
zbms=a-ms
zbyr=b-yr
nbms=ren-zbms
nbyr=ren-zbyr
shu=zbms*10+zbyr
if (shu not in c) and (ok(zbms,zbyr)):
if guolai(nbms,nbyr,c+[shu]):
print "%d and %d,this:%d%d,that:%d%d"%(ms,yr,zbms,zbyr,nbms,nbyr)
return True
return False

def guolai(a,b,c):
if (a==3) and (b==3):
return True
for ms in range(a+1):
for yr in range(b+1):
if (ms+yr>0) and (ms+yr<=chuan):
nbms=a-ms
nbyr=b-yr
zbms=ren-nbms
zbyr=ren-nbyr
shu=zbms*10+zbyr
if (shu not in c) and (ok(zbms,zbyr)):
if guoqu(zbms,zbyr,c+[shu]):
print "%d and %d,this:%d%d,that:%d%d"%(ms,yr,zbms,zbyr,nbms,nbyr)
return True
return False

guoqu(0,2,[33])
...全文
6180 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hugsnow 2008-07-09
  • 打赏
  • 举报
回复
如果是这样,那么没有必要区分过去还是过来,直接一个函数就可以解决了,本来我就写的一个函数,就是因为上面的错误不成功才分成两个函数。
hugsnow 2008-07-09
  • 打赏
  • 举报
回复
谢谢,果然如此,给分
tailzhou 2008-07-09
  • 打赏
  • 举报
回复
你的判断状态重复的方式是错的;

除了判断这边岸上的数目外,还需要判断船在哪一边;

比如:这边岸上有3个牧师,一个野人1;船在对岸与船在这边岸上是两个不同的状态;

可以用个3位数来表示状态,最后一位表示船的状态,初始状态为331,1表示船在这边岸上,0表示在对岸;

bool guoqu(int a,int b,vector < int > c){
...
d=a1*10+b1;
==》
d=a1*100+b1*10+0;

bool guolai(int a,int b,vector < int > c){
...
d=a2*10+b2;
==>
d=a2*100+b2*10+1;
hugsnow 2008-07-09
  • 打赏
  • 举报
回复
修正:const int sheep=2

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧