人工智能实践作业-修道士和野人过河问题:
用编程语言编写和调试一个基于深度优先搜索法的解决“野人与传教士过河”问题的程序。目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单问题,熟悉简单智能算法的开发过程并理解其实现原理。
野人与传教士渡河问题:3个野人与3个传教士打算乘一条船到对岸去,该船一次最多能运2个人,在任何时候野人人数超过传教士人数,野人就会把传教士吃掉,如何用这条船把所有人安全的送到对岸?
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1e5+100;
ll m,c,bn;//m传教士人数,c野人数,bn船上能乘坐的人数
ll path_num;
struct node{
ll m;
ll c;
ll b;
/*node(ll aa,ll bb,ll cc):m(aa),c(bb),b(cc){
m=aa,c=bb,b=cc;
}*/
};
node path[maxn],A;
ll cnt=0;
map<ll,map<ll,map<ll,ll> > > mp;
bool isok(ll tm,ll tc,ll tn){
if(tm<0||tm>m||tc<0||tc>c){
//cout<<tm<<" "<<tc<<" "<<tn<<endl;
//cout<<"1"<<endl;
return false;
}
else if((tm>0&&tc>0&&tm<tc)||((m-tm)>0&&(c-tc)>0&&(m-tm)<(c-tc))){
//cout<<(m-tm)<<" "<<(c-tc)<<endl;
return false;
}
else if(mp[tm][tc][tn]){
return false;
}
return true;
}
void dfs(ll mm,ll cc,ll nn){
//cout<<mm<<" "<<cc<<" "<<nn<<endl;
//cout<<endl;*/
ll tm,tc,tn;
tm=mm,tc=cc,tn=nn;
if(!mm&&!cc&&!nn){
path_num++;
printf("第%d个路径方法\n",path_num);
for(int i=1;i<=cnt;i++){
printf("%lld %lld %lld\n",path[i].m,path[i].c,path[i].b);
}
printf("总共%d个步骤\n",cnt-2);
return ;
}
if(nn==1){
//cout<<nn<<endl;
for(int i=0;i<=bn;i++){
for(int j=0;j<=bn;j++){
if((!i||!j||(i>=j))&&(i+j)>=1&&(i+j)<=bn){
tm=mm-i,tc=cc-j,tn=nn-1;
//cout<<tm<<" "<<tc<<" "<<tn<<endl;
if(isok(tm,tc,tn)){
//cout<<tn<<" "<<nn<<endl;
mp[tm][tc][tn]=1;
cnt++;
path[cnt].m=tm;
path[cnt].c=tc;
path[cnt].b=tn;
dfs(tm,tc,tn);
//path[cnt](0,0,0);
path[cnt].m=0;
path[cnt].c=0;
path[cnt].b=0;
cnt--;
mp[tm][tc][tn]=0;
}
}
}
}
}else if(!nn){
//cout<<nn<<endl;
for(int i=0;i<=bn;i++){
for(int j=0;j<=bn;j++){
if((!i||!j||(i>=j))&&(i+j)>=1&&(i+j)<=bn){
tm=mm+i,tc=cc+j,tn=nn+1;
//cout<<nn<<endl;
/*if(i==1&&j==1){
cout<<isok(tm,tc,tn)<<endl;
}*/
if(isok(tm,tc,tn)){
//cout<<tn<<" "<<nn<<endl;
//cout<<nn<<endl;
mp[tm][tc][tn]=1;
cnt++;
path[cnt].m=tm;
path[cnt].c=tc;
path[cnt].b=tn;
dfs(tm,tc,tn);
//path[cnt](0,0,0);
path[cnt].m=0;
path[cnt].c=0;
path[cnt].b=0;
cnt--;
mp[tm][tc][tn]=0;
}
}
}
}
}
return ;
}
int main(){
std::ios::sync_with_stdio(false);
cin>>m>>c>>bn;
cnt++;
//path[cnt](m,c,1);
path[cnt].m=m;
path[cnt].c=c;
path[cnt].b=1;
if(m>=c){
dfs(m,c,1);
}
if(!path_num){
printf("buxing\n");
}
return 0;
}