美文网首页
狼、羊、菜和农夫过河问题编程实现

狼、羊、菜和农夫过河问题编程实现

作者: _弓长_大人 | 来源:发表于2017-09-04 21:00 被阅读439次

用二进制数 记录状态
1 1 1 1 1
A岸 狼 菜 羊 农夫

最高位表示 A/B岸边,后面分别表示 狼菜羊农夫,0 说明这个岸边没有,1表示这个岸边有
根据题目条件 还要去掉 狼羊 单独 羊菜 单独 狼羊菜单独 的情况。

#include<iostream>
#include<cstdio>
using namespace std;
int graph[32][32];
bool vis[32];
int dig[32][6];// 第几位是一个什么数,下标是从 0 开始的
int path[100];
// 1 1 1 1 1
// 岸狼菜羊人
void init()
{
    for(int i=0;i<32;i++)
        vis[i]=false;
    for(int i=0;i<32;i++)
    {
        int j=0;
        int temp=i;
        while(temp)
        {
            dig[i][j++]=temp%2;
            temp=temp/2;
        }
    }
    int duiAn=0;
    for(int i=31;i>=0;i--)
    {
        if(dig[i][0])//这一侧有人
        {
            // 载自己到对岸
            duiAn=31^(i-1);
            graph[i][duiAn]=1;
            for(int k=1;k<4;k++)
            {
                if(dig[i][k])
                {
                    duiAn=31^(i-(1<<k)-1);
                    graph[i][duiAn]=1;
                }
            }
        }
    }
}
bool flag=false;
int ans=1;
bool check(int i)
{
    if(i!=30&&i!=14&&i!=10&&i!=26&&i!=22&&i!=6)
        return true;
    return false;
}
void dfs(int x,int cnt)
{
    vis[x]=true;
    path[cnt]=x;
    if(x==15)
    {
        printf("%d :",ans);
        for(int i=0;i<cnt;i++)
        {

            for(int j=3;j>=0;j--)
            {
                if(dig[path[i]][j])
                {
                    if(j==3)
                        cout<<"狼";
                    else if(j==2)
                        cout<<"菜";
                    else if(j==1)
                        cout<<"羊";
                        else
                        cout<<"农";
                }
            }
             cout<<" -> ";
        }
        for(int j=3;j>=0;j--)
            {
                if(dig[path[cnt]][j])
                {
                    if(j==3)
                        cout<<"狼";
                    else if(j==2)
                        cout<<"菜";
                    else if(j==1)
                        cout<<"羊";
                        else
                        cout<<"农";
                }
            }
        cout<<endl;
        ans++;
    }
    for(int i=0;i<32;i++)
    {

        if(graph[x][i]&&!vis[i]&&check(i^31))
        {
            dfs(i,cnt+1);
            vis[i]=false;
        }
    }
}
int main()
{
    init();
    dfs(31,0);
    return 0;
}

相关文章

  • 狼、羊、菜和农夫过河问题编程实现

    用二进制数 记录状态1 1 1 1 1A岸 狼 菜 羊 农...

  • 人狼羊草问题

    1.题目: 一农夫带着一头狼,一只羊和一担草过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃草,只有农夫在时...

  • 狼羊菜过河

    一个农夫在河边,需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,...

  • Weekly 2019-44

    本周温习一下流程图的知识点 练习一下 一、把大象装里冰箱里 二、农夫、羊、狼和白菜过河的故事

  • 基于JAVA实现的农夫过河问题

    1 题目要求 一个农夫带着一只狼,一只羊和一个白菜,身处河的两岸。他要把这些东西全部运到北岸。他面前只有一条小船,...

  • 亡羊补牢现代版

    其实,农夫丢失的那只羊并不是被狼吃了,是它自愿出走的。 其实,农夫丢失的那只羊并不是被狼吃了,是它自愿出走的。 那...

  • 农夫过河

    问题描述: 在很久很久以前,有个农夫叫小明(ง •_•)ง,他面前有条长长的小河,农夫当然是可以游过去的,但他还有...

  • 算法谜题APP 应用官网

    汉诺塔,八皇后,约瑟夫环,狼羊菜过河,幻方,经典的谜题不但充满着无穷的魅力,更是计算机科学的基础。而算法更是在计算...

  • 只有方法正确,每个孩子都可以成为学霸

    继上次周长的问题解决后,现在又面临着倍数应用题的问题。 狼村里住了一些狼和羊,狼比羊多19只,且狼的数量比羊的3倍...

  • 狼性和羊性

    在中国文化中,狼和羊是两个具有特定内涵的动物。《狼和小羊》教科书中寓言故事,与《农夫和蛇》一起将狼和蛇钉上文化中恶...

网友评论

      本文标题:狼、羊、菜和农夫过河问题编程实现

      本文链接:https://www.haomeiwen.com/subject/fhcyjxtx.html