先从过河原理出发———狼与羊不能单独一起,羊与草不能单独一起,由此可见草是能否过河的关键。因此·草必须第一次过河且不能只是一次过河,这就需要应用到队列,队列的性质先进先出。羊先到对岸之后,因为羊与狼和草都不能单独共存,因此在狼或草到队列之后羊必须离开对岸,因此满足队列的先进先出。
代码是基于设置两个队列(左岸与右岸),即模拟由0000转变为1111的过程,通过设置限制条件和判段语句,最后在用move函数来模拟过河。
#include<iostream>
using namespace std;
struct state{
bool a1,a2,a3,a4;
int backdate=-1;
state()
{
a1 = a2 = a3 = a4 = true;
}
};
void assign(state& A,state& B)
{
A.a1=B.a1;
A.a2=B.a2;
A.a3=B.a3;
A.a4=B.a4;
A.backdate = B.backdate;
}
bool qwee(state&A,state&B)
{
if(A.a1==B.a1&&A.a2==B.a2&&A.a3==B.a3&&A.a4==B.a4)
{
return true;
}
return false;
}
state sQueue[300];
int startans = 0;
int endans = 1;
state Stateing;
bool isInQueue(state& froState)
{
for(int i=0;i<endans;i++)
{
if(qwee(froState,sQueue[i]))
{
return true;
}
}
return false;
}
void inQueue(state& froState)
{
assign(sQueue[endans],froState);
endans++;
}
bool tryValid(state& froState)//判断所有不能存在的情况
{
if((froState.a1==false&&froState