/** 农夫过河问题** 大家有没有看过我的C学习中的位算,我们用8位二进制的数字来表示任务的完成与否,1完成、0未完成* 现在我们用4个二进制数来代表* 第一位表示农夫(1:北岸,0:南岸)* 第二位表示狼  (1:北岸,0:南岸)* 第三位表示?? (1:北岸,0:南岸)* 第四位表示白菜(1:北岸,0:南岸)* 我们怎么判断农夫在哪(是不是把当前状态与1000进行 & 操作,为1就在北岸,为0 就在南岸)* 那么判断安全(羊的位置不等于狼,羊位置不等于白菜,且两个状态可以存在的是农夫在)* 那么接下去我们来进行广度优先的遍历,当满足条件时,我们就把新的状态push进队列中去* 且我们要记录路径,所以需要一个并查集数组,0-15即可**/
#include <iostream>
#include <stdio.h>
#include "SqQueue.h"
#define BIT(x) (1<<x)
#include <vector>
#include <algorithm>using namespace std;//第一位农夫。第二位狼。第三位白菜,第四位白菜
enum Status{FARMER  = BIT(3),   //农夫WOLF    = BIT(2),   //狼GOAT    = BIT(1),   //羊CABBAGE = BIT(0)    //白菜
};//farmer的位置
int farmer(int location){if((location&FARMER) != 0)return 1;return 0;
}//wolf的位置
int wolf(int location){if((location&WOLF) != 0)return 1;return 0;
}//goat的位置
int goat(int location){if((location&GOAT) != 0)return 1;return 0;
}//cabbage的位置
int cabbage(int location){if((location&CABBAGE) != 0)return 1;return 0;
}int isSafe(int location){if((wolf(location) == goat(location)) && (farmer(location) != goat(location)))return 0;if((cabbage(location) == goat(location)) && (farmer(location) != goat(location)))return 0;return 1;
}void farmer_location(int location){if(farmer(location) == 1){printf("从南岸到北岸\n");}else{printf("从北岸到南岸\n");}
}void farmer_acrry(int currStatus, int afterAtatus){int status = currStatus^afterAtatus;switch(status){case 12:printf("把狼带过河\n");break;case 10:printf("把羊带过河\n");break;case 9:printf("把菜带过河\n");break;default:printf("什么都不带\n");break;}
}void farmer_cross_river(){//    std::vector<bool> visited(16, false);SqQueue<int> q;  //定义队列来存放新的状态int arr[16]; //定义并查集,并初始值为-1for(int i = 0; i < 16; i++){arr[i] = -1;}int location; //int正好是4个字节q.push(0);arr[0] = 0;  //第一个状态是默认的int newLocation; //新的位置情况
//    visited[0] = true;while( (!q.isEmpty()) && (arr[15] == -1)){  //队列不为空,且位置还没终止的位置location = q.front();q.pop();//每次农夫可以带的东西有自己、狼、羊、白菜for(int allStatus = 1; allStatus <= 8; allStatus <<= 1){//但是,带的时候需要的是在同一边if((farmer(location)!=0) == ((allStatus&location)!=0)){//那么每次要带什么呢,可以一个人走,有也可以带东西newLocation = location^( FARMER|allStatus ); // 渡河后的情况if(isSafe(newLocation) && (arr[newLocation]==-1)){cout <<"newLocation : ";cout << newLocation << endl;q.push(newLocation); //符合条件,推进去队列中去arr[newLocation] = location; //更新并查集//                visited(newLocation) = true;}}} //for end}  //while end
//
//    for(int i = 0; i < 16; i++){
//        cout << arr[i] << " " << endl;
//    }//现在从1111的位置通过并查集来推到0000的位置来推出路径int res[16] = {0};int counter = 0;if(arr[15] == -1){printf("no solution");}else{for(int status = 15; status !=0; status = arr[status]){res[counter++] = status;}//打印一下状态for(int i = 0; i < counter; i++){cout << res[i] << " " << endl;}for(int i = 0; i < counter; i++){int currStatus= res[i]; //第一次状态
//            res.pop_back();int afterStatus = res[i+1]; //第二次状态
//            res.pop_back();//然后我们进行对比一下farmer_location(currStatus);farmer_acrry(currStatus, afterStatus);}}
}int main(){farmer_cross_river();return 0;
}

C++ 农夫过河问题相关推荐

  1. 用BFS(广度优先搜索queuelist)算法解决农夫过河问题

    用BFS(广度优先搜索queue&&list)算法解决农夫过河问题 一.问题需求分析 一个农夫带着一只狼.一只羊和一棵白菜,身处河的南岸.他要把这些东西全部运到北岸.问题是他面前只有一 ...

  2. c语言农夫过河游戏代码解释,农夫过河C++代码

    农夫过河C++代码 ///农夫过河C++代码 ///   作者:lyb661  时间:2015年8月 /* 农夫过河问题思路:主要使用用容器,一个存储此岸,一个存储彼岸,一个存储结果(用于打印). 过 ...

  3. 狼、羊、菜、农夫过河问题 穷举 Python实现

    仍然是王晓华老师的算法课程,穷举问题中的狼.羊.菜和农夫过河问题,该问题与"三个水桶倒水"问题相似,需穷举状态,同时仍需判断动作的有效性. 状态初始值是 [left,left,le ...

  4. 农夫过河算法最简便的c语言,C语言农夫过河

    问题描述 一个农夫在河边带了一只狼.一只羊和一颗白菜,他需要把这三样东西用船带到河的对岸.然而,这艘船只能容下农夫本人和另外一样东西.如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜.请编程为农夫解决这 ...

  5. c语言课程农夫过河问题实验心得,农夫过河实验报告

    <农夫过河实验报告>由会员分享,可在线阅读,更多相关<农夫过河实验报告(22页珍藏版)>请在人人文库网上搜索. 1.数据结构与算法综合实验"课程设计报告题目:农夫过河 ...

  6. java农夫过河_C语言实现农夫过河代码及解析

    问题描述 一个农夫在河边带了一只狼.一只羊和一颗白菜,他需要把这三样东西用船带到河的对岸.然而,这艘船只能容下农夫本人和另外一样东西.如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜.请编程为农夫解决这 ...

  7. 农夫过河算法java,Java农夫过河问题的继承与多态实现详解

    Java农夫过河问题的继承与多态实现详解 发布时间:2020-08-22 06:04:29 来源:脚本之家 阅读:61 作者:小任性嘛 题目描述: 一个农夫带着一匹狼.一只羊.一颗白菜要过河,只有一条 ...

  8. 【华为OD机试真题 python】羊、狼、农夫过河【2022 Q4 | 100分】

    前言 <华为OD笔试真题 python> 专栏含华为OD机试真题.华为面试题.牛客网华为专栏真题. 如果您正在准备华为的面试,或者华为od的机会,有任何想了解的可以私信我进行交流.我会尽可 ...

  9. 农夫过河问题的c语言实现

    文章来源:http://blog.csdn.net/neweastsun/archive/2009/11/08/4785611.aspx 一.        问题需求分析 一个农夫带着一只狼.一只羊和 ...

  10. 农夫过河问题(一个有趣的问题-位运算)

    一个农夫带着一只狼.一只羊和一棵白菜,身处河的南岸.他要把这些东西全部运到北岸.问题是他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船.另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能 ...

最新文章

  1. SVO Without ROS环境搭建
  2. linux设备驱动第一篇:设备驱动程序简介
  3. Flutter中关键字Const和Final之间的区别
  4. VMware虚拟机直连物理网络的两种方式
  5. 那些年我们排过的序之希尔排序
  6. php获取今天是几号,php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳以及当月共有多少天...
  7. php smtp报文_PHP 使用 SMTP 发送邮件教程(PEAR Mail 包)
  8. Android中的AnimationDrawable的使用
  9. MySQL回闪_MySQL进行BINLOG回闪
  10. YUV采样及存储格式
  11. 老吴做了15年电商,从简单的卖货,到卖供应链
  12. 新型冠状病毒数据抓取及整理详细流程
  13. indesign教程,如何创建和编辑图形元素的框架?
  14. java 简易扫雷_JAVA基础课程设计 简易扫雷
  15. H5中启动Android app
  16. SocksProxy代理服务器下载,附IE使用socks代理的方法
  17. UVA - 10105 Polynomial Coefficients
  18. 【高数】高数第七章节——微分方程概念一阶微分方程高阶微分方程
  19. B2C之新岛咖啡 一堂62元的供应链管理课
  20. 使用SDNN (space displacement neural network)进行多字体手写识别

热门文章

  1. 基于Vue实现一个简易的小程序框架,浅谈kafka | 每日掘金第 194 期
  2. m基于MATLAB的上行链路MIMO关键技术的研究与性能分析
  3. Flex中实现double-click修改DataGrid
  4. matlab拟合伽玛曲线,HDR详解 - 伽玛曲线
  5. python sdklive2d_Unity使用Live2DSDK制作游戏(Demo制作1)
  6. RDKit | 子结构搜索和MCS算法
  7. Window_MySQL初始化(重置)数据库
  8. iphone 同步灰色_如何将我的iPhone中的联系人与Google Gmail帐户同步
  9. Bia布刷题日记2022/2/17
  10. java 字节流乱码_java用字节流读取中文乱码怎么解决?