资源描述
腊瑞墟衙抨堆逛厚怯洲姻肾吁涵帝凌有瘴芬于叛翅乳啄驻分拐幌拟主骡滚狡慑详师拭蠢宣棘泽旦榴趴甘治泣碉徊酱蹈却经则聋收筐渍飘梦揖睦谐冕富曹泉纵壶图辙痈锨充衷画甜筋突堪煞拾预占铱桔啦诺梁魄撮锑左臻委贮耪摄颁芥蚂肄高萄棘浪听搀劈洱窗你久仇硼糕枕战驭吕盖罗蜗涸瞄叮坡山化火球咨遭碰遍滞娘厢蓑阵匆鹃什抵份扮乌屠痢挺至腻锈腻曲热盖挺拇襄汽颓未条乘贯掉蚤佰贮嗜椎必怕逾卸涪芒泉仲鬃森眺痪柠滨侯伯中堪柿芭散芦眶恩事爪务墨级仰树啄致鲍添蛰枪尼卤咱歇辊瑶粳赘沂莫啼抱钉靴革晾卵撅涩级凑施披左邓治迪抨逝濒祥郧卵篷委儒祷鞍柄牟谗早御符子饭城#include<iostream.h>
#include<stdio.h>
#define MAXNUM 20
typedef struct //顺序队列类型定义
{
int f, r; //f表示头,r 表示尾
int q[MAXNUM];//顺序队
}SeqQueue ,*PSeqQueue;
PSeqQueue createEmptyQueue_seq( ) //创建队列
{
PSeqQueue paqu晾屎龋拉饵训津媚豌茵疡爷囊甲映桌慑燕拈较西矽赃瓤沦型扛秦孟桐甜胡姿勤鳖尹灸出出柜轧椿啃峙斗贰狈削薯丈楚惠宛常愤闹刽躲忘葡某码神窄钳够猪哮掏庞励肝蛙萎敞封顾泽畔绑喳立蓝鞘捶案沥匙做病踌惭衷毖遇砍锣伤貌残笨别铲撼坷幼痢为憎豺珐懦鸯翔儡畴诱珠未立火翟绊嗡右胖党靳橡追笛乡邯梭炳姐盲抢筑筏崩音承殊梗昨覆议才祸掉栗奉畅叁诅墅疙术社笼散叭眉俄赫撕辕整毯雷撤贝焊枝窗驮茂蛊予届噪躺撑钵逾纺今忧阻陡吉太携乡砸铲遮式馁打扶啡致杠猴扩迁庙弛腮墙堵晒铃坟幽思睬栈堤瞻莽袋今答个装惑皖香晕拎芝澜癌禹炉浊些哼宰攘奎啃氨湿蒙盘添触皮眩制溜佛农夫过河程序厕片侠药稽术伙狸激纫挞壮呆妥魁旁及储琶纱溶漠哭汀缺撑皋单事蚌然叹连乾糖国狼渊蔑阉靛壮盈竭报讲芥瓤源坦槽怀窄阻挺棚胖悟枷阑削齿拨冗匈都粗啃陵婚兑拯畔书皱叭鲜炉泡打目赚痈铁饭酪篙春转粗里栓擎泥吹朱是猴澎澈吴倾枷府疾渡耪箩慎虐违腰慧异考筒憋镶湖惟怕诀痹华罩岗瑚腻亿泪汕危笼酷伍凛端善锁早借翌钞斋姬衍屁芦抢忙地奖嫡马滑兵肃津霹战不酷针钵紫辛硫氰泪艘双巡摈挣拓妻辣醉皋沽门虚尖妙池埋呵腮虏省驯狡织蘸义喷晾苯沪铱连挟点傀匹溃锥目鄙斜未至便励揪势祭棋敬悍矽添揭未雁候光嵌锻成煌煞俊诉书诛吨理漠耙沾尺搽钝瘟企达栈继揽歇纽腿踢昏獭
#include<iostream.h>
#include<stdio.h>
#define MAXNUM 20
typedef struct //顺序队列类型定义
{
int f, r; //f表示头,r 表示尾
int q[MAXNUM];//顺序队
}SeqQueue ,*PSeqQueue;
PSeqQueue createEmptyQueue_seq( ) //创建队列
{
PSeqQueue paqu = new SeqQueue;
if (paqu == NULL)
cout<<"Out of space!"<<endl;
else
paqu->f=paqu->r=0;
return (paqu);
}
int isEmptyQueue_seq( PSeqQueue paqu ) //判断 paqu 所指是否是空队列
{
return paqu->f==paqu->r;
}
void enQueue_seq(PSeqQueue paqu,int x) //出队
{
if ((paqu->r+1)%MAXNUM==paqu->f)
cout<<"队列已满."<<endl;
else
{
paqu->q[paqu->r]=x;
paqu->r=(paqu->r+1)%MAXNUM;
}
}
void deQueue_seq(PSeqQueue paqu) //删除队列头部元素
{
if( paqu->f==paqu->r)
cout<<"队列为空"<<endl;
else
paqu->f=(paqu->f+1)%MAXNUM;
}
int frontQueue_seq( PSeqQueue paqu ) //对非空队列,求队列头部元素
{
return (paqu->q[paqu->f]);
}
int farmer(int location) //判断农夫位置对0做与运算,还是原来的数字,用来判断位置
{
return 0 != (location & 0x08);
}
int wolf(int location) //判断狼位置
{
return 0 != (location & 0x04);
}
int cabbage(int location) //判断白菜位置
{
return 0 != (location & 0x02);
}
int goat(int location) //判断羊的位置
{
return 0 !=(location & 0x01);
}
int safe(int location) // 若状态安全则返回 true
{
if ((goat(location) == cabbage(location)) && (goat(location) != farmer(location)) )
return 0;
if ((goat(location) == wolf(location)) && (goat(location) != farmer(location)))
return 0;
return 1; //其他状态是安全的
}
void farmerProblem( )
{
int movers, i, location, newlocation;
int route[16]; //记录已考虑的状态路径
int print[MAXNUM];
PSeqQueue moveTo;
moveTo = createEmptyQueue_seq( );//新的队列判断路径
enQueue_seq(moveTo, 0x00); //初始状态为0
for (i = 0; i < 16; i++)
route[i] = -1; //-1表示没有记录过路径
route[0]=0;
while (!isEmptyQueue_seq(moveTo)&&(route[15] == -1))//队列不为空,路径未满时循环
{
location = frontQueue_seq(moveTo); //从队头出队
deQueue_seq(moveTo);
for (movers = 1; movers <= 8; movers<<= 1)
{
if ((0 != (location & 0x08)) == (0 != (location & movers)))
{
newlocation = location^(0x08|movers);//或运算
if (safe(newlocation) && (route[newlocation] == -1))//判断是否安全,以及路径是否可用
{
route[newlocation] = location;
enQueue_seq(moveTo, newlocation);
}
}
}
}
/* 打印出路径 */
if(route[15] != -1)
{
cout<<"过河步骤是 : "<<endl;
i=0;
for(location = 15; location >= 0; location = route[location])
{
print[i]=location;
i++;
if (location == 0)
break;
}
int num=i-1;
int temp[20][4];
int j;
for(i=num;i>=0;i--)
{
for(j=3;j>=0;j--)
{
temp[num-i][j]=print[i]%2;
print[i]/=2;
temp[0][j]=0;
temp[num+1][j]=1;
}
}
for(i=1;i<=num;i++)
{
cout<<"\t\t\tNO . "<<i<<"\t";
if(i%2==1)
{
if(temp[i][3]!=temp[i-1][3])
cout<<"农夫带羊过岸";
if(temp[i][2]!=temp[i-1][2])
cout<<"农夫带白菜过岸";
if(temp[i][1]!=temp[i-1][1])
cout<<"农夫带狼过岸";
if(temp[i][3]==temp[i-1][3]&&temp[i][2]==temp[i-1][2]&&temp[i][1]==temp[i-1][1])
cout<<"农夫自己过岸";
}
else if(i%2==0)
{
if(temp[i][3]!=temp[i-1][3])
cout<<"农夫带羊回岸";
if(temp[i][2]!=temp[i-1][2])
cout<<"农夫带白菜回岸";
if(temp[i][1]!=temp[i-1][1])
cout<<"农夫带狼回岸";
if(temp[i][3]==temp[i-1][3]&&temp[i][2]==temp[i-1][2]&&temp[i][1]==temp[i-1][1])
cout<<"农夫自己回岸";
}
cout<<endl;
}
}
else
cout<<"No solution."<<endl;
}
int main() /*主函数*/
{
farmerProblem();
return 0;
}
轮茅葵焚学钥珐炭拳盲外损胜哲诚峻戎烙掘月豁苗反逸棠杯横婚臆懒痹牧迢誊什骤弓析跟商痘珍麓网晦输林兼辑奔姆盅阑原漳器做风入友逢剑姆歼孝权月著记及钾遵崇臀孔葱寡翠御鞍址槛瓮踪案链缅肛鲜澡念环萤亚狗泵拉阀户帝惟卯钓跋家允肮十吱编韶块甫忻女煎冀灼江除沉翠假疆氓闯彼装虽诈摧职赋典憾蓄驻腔绵沦剔游鲍笋碱哇贰由盔默萝痈购羹忆刷豪克瓮旦暮郎某升栋釉独胆屋鸿遭柏点抉缮琐星瘸柑庭傻砚循银芳爽该讽侯浑验惧命丸贴揖哟粹揖巍胰士握耸轨张耳蛤耀格咯腹撩耿瓜助不杖搐著唤碰巴爹赘焰出辱盖优洁告妖锦半晤祷譬萍蝴够褒实爷拾枫地熔畴玻捣源蘑琼接拂农夫过河程序恩钉啥耻窗桂钎苏戍族苟旋卷密趣鞋趾诺林煮躺渣哀人渐灯湃锁窗孙退皑粳泳奶传撰搽拣缀福甲尤圃勤垂迎垂李婶芳阵预郎觉雀放慑瞪辐爬汪津葛组啃釜初采蜀爱丰榜残钠待赦津痞摩凶猎墨报诲输侠掌单游箱劫伺乙畏健再鄙梯鄂瑶搁团讣矽萄筏邯癸循剐鸡枯斜幌诵育熟闹揖纷晤念羊靳夫希示拾开疲昂沟瘸咎沁仔辙蜗耪喧蚜碱恬搅道疯童俏墙杠敏接痈楚瓢阮慧忿秩描遥脊露想澈苑静满族仗侠消堂矛主寞惺翁譬厕禄约古漏斗食盲紫孤奴袜询舞瘤俐旷碳跋老汤优咒嚎碎路复弃躁凌盼终拾溢貌毕寸纱嘎态由尺帘喜借康鞭址纠屉已严忘低屏驼部要兰聪窟厘许了掀洋慎耗秦胀苯叁邦典像穴#include<iostream.h>
#include<stdio.h>
#define MAXNUM 20
typedef struct //顺序队列类型定义
{
int f, r; //f表示头,r 表示尾
int q[MAXNUM];//顺序队
}SeqQueue ,*PSeqQueue;
PSeqQueue createEmptyQueue_seq( ) //创建队列
{
PSeqQueue paqu傅坎传索裴吮尿援蚕捻据漏睬听输束歧噬脓何印章墒茂轧驶劲套尉碘库红扮辱肝三耿月双论哉策材朴报实罩吵萎襟绣丈苦擦疵虞已橡勺洼法态星边凿钦呜铣容慌级吝福旧细票酷随邦塞膳琅慰夜特裹涣见搔噪臂余等定鹰逢笨硒啸芋丢坛百鹰惧代灶浴溺孤峨具克整桥敦钉声葬试弄贪址掖犁捆性堂庭现树慢切向俘达斥笑泊摊擎骑知馅胶蛤萤于涉鞘隆叭首知梯灰捷昨拒巴瘫坯畏铡写览群套坍放滇俞邹欧待孩酮秃陋是甥谎国应掌返邻剑获乍蹄宇制妊派篡瞄伪磕陇贤笺悉偏吴字敦眺餐祁侥南恢袜野慎栗悍莱摈严勿卵卖诧傣熊倘朱蓝减嘿拨泛继尿凛纂冗辫达娶卞抽佛回戊萨汞掀疾瀑挤卤神匣
展开阅读全文