#include "stdio.h"/*对本系统来说,可取状态向量可以通过穷举法列出来。可取向量共10个 ,而且右边5个正好是左边5个的相反状态。我们将船的一次运载也用向量表示,当一物在船上时相应分量记为1,否则记为0。如(1,1,0,0)表示人和狗在船上。(1,1,1,1)(0,0,0,0)(1,1,1,0)(0,0,0,1)(1,1,0,1)(0,0,1,0)(1,0,1,1)(0,1,0,0)(1,0,1,0)(0,1,0。1) 本系统的运算向量有四个:(1,0,1,0),(1,1,0,0),(1,0,0,1),(1,0,0,0) 一次过河就是一状态向量和一运算向量的加法,在加法运算中,对每一分量采用二进制。(0+0=0,1+0=0+1=1,1+1=0)。 根据以上假定,人,狗,鸡,米过河问题转化为:找出从状态(1,1,1,1)经过奇数次运算变为状态(0,0,0,0)的系统状态转移过程。 */struct vex {int hum;int dog;int coc;int ric;};vex start,meth[4];void Initstate(){start.hum=1;start.dog=1;start.coc=1;start.ric=1; //(1,0,1,0),(1,1,0,0),(1,0,0,1),(1,0,0,0)meth[0].hum=1;meth[0].dog=0;meth[0].coc=1;meth[0].ric=0;meth[1].hum=1;meth[1].dog=1;meth[1].coc=0;meth[1].ric=0;meth[2].hum=1;meth[2].dog=0;meth[2].coc=0;meth[2].ric=1;meth[3].hum=1;meth[3].dog=0;meth[3].coc=0;meth[3].ric=0;}vex Padd(vex a,vex b){vex sum;sum.hum=(a.hum+b.hum)%2;sum.dog=(a.dog+b.dog)%2;sum.coc=(a.coc+b.coc)%2;sum.ric=(a.ric+b.ric)%2;return sum;}bool Issafestate(vex s){if(s.hum==1&&s.dog==1&&s.coc==1&&s.ric==1)return true;if(s.hum==1&&s.dog==1&&s.coc==1&&s.ric==0)return true;if(s.hum==1&&s.dog==1&&s.coc==0&&s.ric==1)return true;if(s.hum==1&&s.dog==0&&s.coc==1&&s.ric==1)return true;if(s.hum==1&&s.dog==0&&s.coc==1&&s.ric==0)return true;if(s.hum==0&&s.dog==0&&s.coc==0&&s.ric==0)return true;if(s.hum==0&&s.dog==0&&s.coc==0&&s.ric==1)return true;if(s.hum==0&&s.dog==0&&s.coc==1&&s.ric==0)return true;if(s.hum==0&&s.dog==1&&s.coc==0&&s.ric==0)return true;if(s.hum==0&&s.dog==1&&s.coc==0&&s.ric==1)return true;return false;}void main(){Initstate();vex safestate,tmp;while(start.hum!=0||start.dog!=0||start.coc!=0||start.ric!=0){for(int i=0;i<4;i++){tmp=Padd(start,meth[i]);if(Issafestate(tmp)){start=tmp;printf("(%d,%d,%d,%d)",start.hum,start.dog,start.coc,start.ric);getchar();}}}}
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试