c语言-关于农夫问题的C语言解决

问题描述

关于农夫问题的C语言解决

以下代码输出为no solutin.,请问错在哪里?

 #include<stdio.h>
#include<stdlib.h>
struct seqqueue
{
    int maxnum;
    int f,r;
    int *data;
};
int main()
{
    struct seqqueue *createemptyqueue_seq(int m);
    void enqueue_seq(struct seqqueue *p,int x);
    void dequeue_seq(struct seqqueue *p);
    int frontqueue_seq(struct seqqueue *p);
    int isemptyqueue_seq(struct seqqueue *hq);
    int farmer(int location);
    int wolf(int location);
    int cabbage(int location);
    int goat(int location);
    int safe(int location);
    void farmerproblem();
    farmerproblem();
    return 0;
}
struct seqqueue *createemptyqueue_seq(int m)             //创建空队列
{
    struct seqqueue *p=(struct seqqueue*)malloc(sizeof(struct seqqueue));
    if(p!=NULL)
    {
        p->maxnum=m;
        p->data=(int*)malloc(sizeof(int)*p->maxnum);
        if(p->data)
        {
            p->f=p->r=0;
            return p;
        }
        else
        {
            free(p);
        }
    }
    printf("out of space!");
    return NULL;
}
void enqueue_seq(struct seqqueue *p,int x)          //入队
{
    if((p->r+1)%p->maxnum==p->f)
        printf("full queue.");
    else
    {
        p->data[p->r]=x;
        p->r=(p->r+1)%p->maxnum;
    }
}
void dequeue_seq(struct seqqueue *p)                     //出队
{
    if(p->f==p->r)
        printf("empty queue!");
    else
        p->f=(p->f+1)%p->maxnum;
}
int frontqueue_seq(struct seqqueue *p)              //取队列的头元素
{
    if(p->f==p->r)
        printf("empty queue!");
    else
        return (p->data[p->f]);
}
int isemptyqueue_seq(struct seqqueue *q)
{                                                   //判断队首或队尾任一个指针是否为空即可
    if(q->r==q->f)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int farmer(int location)         //判断农夫的位置
{
    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)             //安全状态判断函数
{
    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 i,movers,location,newlocation;
    int route[16];
    struct seqqueue *moveto;
    moveto=createemptyqueue_seq(17);
    enqueue_seq(moveto,0x00);
    for(i=0;i<16;i++)
        route[i]=-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^(0x00|movers);
                if(safe(newlocation)&&(route[newlocation]==-1))
                {
                    route[newlocation]=location;
                    enqueue_seq(moveto,newlocation);
                }
            }
    }
    if(route[15]!=-1)
    {
        printf("the revers path is:n");
        for(location=15;location>=0;location=route[location])
        {
            printf("the location is:%dn",location);
            if(location==0)exit(0);
        }
    }
    else printf("no solution.n");
}

解决方案

这行错了
newlocation=location^(0x00|movers);
修改
newlocation=location^(0x08|movers);

解决方案二:

http://blog.sina.com.cn/s/blog_50d936c40100e2wl.html

解决方案三:

http://blog.csdn.net/jamesjxin/article/details/6891188

解决方案四:

newlocation=location^(0x00|movers);
修改
newlocation=location^(0x08|movers);

时间: 2024-10-27 22:30:03

c语言-关于农夫问题的C语言解决的相关文章

c语言-请问怎么学好《C语言程序设计教程》

问题描述 请问怎么学好<C语言程序设计教程> 这本书下学期就要学了,可是看着迷迷糊糊,看不懂,有没有什么学习的捷径?什么配套的辅导书比较好?谢谢! 解决方案 简单来说,就是Reading+Coding. 阅读入门可以从谭浩强的<C程序设计>开始,国人所写比较符合我们的思维习惯,但是过于基础,许多细节问题没有讲到,所以看完那本可以接着看看<C语言深度解剖>. 另外还有两本国外的C语言经典著作<C程序设计语言><数据结构与算法分析--C语言描述>,可

【Go语言】【5】GO语言变量

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1615103 变量也是语言的基本元素,与GO语言的常量类似,常量使用const关键字修饰,而变量使用var关键字修饰,变量声明的形式为var variableName variableType 一.变量声明 var age int var phone int var name string var addre

把c++语言转换成c语言-如何把C++语言编写的代码转换成C语言

问题描述 如何把C++语言编写的代码转换成C语言 #include <stdlib.h>#include <stdio.h> #include <string.h>#include <conio.h>#include <iostream.h>#define N 50 //系统中学生的最大数量int n=3; //学生数量的初始值struct student { int sid; char name[10]; char num[14]; float

c语言 结构体函数:PHP的语言结构和函数的区别

相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等.例子: if ( isset($user) ) { //do some thing }原因是isset是语言结构,而strlen是一个函数.还有echo 是个语言结构,不是个函数.那什么是语言结构呢?它和函数有什么不同吗?1. 什么是语言结构和函数语言结构:就是PHP语言的关键词,语言语法的一部分:它不可以被用户定义或者添加到语言扩展或者库中:它可以有也可以没有变量和返回值.函

Win8系统中文语言里添加英文输入法失败怎么解决?

  Win8系统中文语言里添加英文输入法失败怎么解决?           1.首先,在桌面上单击鼠标右键,选择"新建"-->"文本文档";复制下面代码到其中; 2.将此txt文件另存为可操作注册表的reg文件,依次选择记事本菜单栏的"文件"-->"另存为",确定好保存位置,然后在选择最下面的"保存类型"为"所有文件",在上面"文件名"一项填入:中文语言下

Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

原文:Win10 UWP 开发系列:使用多语言工具包让应用支持多语言 之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工具包的使用,但因社区改版那篇文章已经找不到了. 当时写的时候还没有出Win10的SDK,都是基于UAP框架写的.微软早已经发布了Win10的SDK,相应的项目结构也发生了变化,以前分为两个项目通过Share项目共享代码的方式被抛弃

【Python成为高收入国家增长最快的语言】开发者生态系统十大语言

我们最近的研究表明,富裕国家(世界银行定义为高收入国家)喜欢研究的技术与其他国家的不同.其中,我们看到最大的差异是Python语言.当我们关注高收入国家的时候,甚至可以看到Python的增长速度甚至比Stack Overflow Trends或者其他一些全球软件开发排名显示的还要快. 在这篇文章中,我们将探讨过去五年中Python语言不寻常的增长速度,正如在高收入国家的Stack Overflow流量中所示的那样. "增长最快"一词可能很难精确定义,但是我们认为Python确实是增长最

【Go语言】【12】GO语言的结构体

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1671463        当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java.C++,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切:同时从另一个角度上看结构体与面向对象中的成员对象是多么的相像 :) 一.结构体元素 结

关于如何把c语言的数据结构改成c语言疏忽

问题描述 关于如何把c语言的数据结构改成c语言疏忽 引用标志符(&)在C里不支持,那应该怎么改才能在c里使用Status InitList_Sq( SqList &L ) 解决方案 数据结构之希尔排序(C语言)c语言数据结构之链表 解决方案二: Status InitList_Sq( SqList *L ) 解决方案三: 如果SqList是一个指针,那么L就是指针的指针,改变这个指针的值,就可以在内外传值