一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。问题是他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船。另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜或者狼和羊单独在河的一边,自己离开。请问农夫该采取什么方案才能将所有的东西运过河呢?

解答:

要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸。因此整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。在这个问题中就是要找出一个从0000->1111的迁徙序列,并满足上述的约束要求。用vis[]记录每个状态是否被访问过,并记下访问此点的前驱节点。

#include <cstdio>
#include <queue>
using namespace std;queue<int> Q;
int vis[16];
char nb[16][6]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};bool farmer(int s)
{return s&(1<<3);
}bool wolf(int s)
{return s&(1<<2);
}bool cabbage(int s)
{return s&(1<<1);
}bool goat(int s)
{return s&1;
}bool check(int s)
{if((wolf(s)==goat(s)) && (wolf(s)!=farmer(s)))return false;else if((cabbage(s)==goat(s)) && (goat(s)!=farmer(s)))return false;return true;
}void print(int u)
{if(u!=vis[u]){print(vis[u]);printf("->%s",nb[u]);//printf("->%d",u);}elseprintf("%s",nb[u]);//printf("%d",u);
}int main()
{int s, ns;printf("此题使用位运算:\n四位如:0000-从左到右依次为:\n");printf("农夫、狼、白菜、羊..\n");for(int i=0;i<16;i++) vis[i]=-1;vis[0]=0;Q.push(0);while(!Q.empty()){s=Q.front(); Q.pop();for(int i=1;i<=8;i=i<<1){if(farmer(s) == (bool)(s&i))   //把每一位与最高位比较{ns=s^((1<<3)|i);if(check(ns) && vis[ns]==-1){vis[ns]=s;Q.push(ns);}}}if(vis[15]>=0) break;}printf("\n问题的解决方案为:\n");print(15);printf("\n");return 0;
}

农夫过河问题(一个有趣的问题-位运算)相关推荐

  1. java位于算——一个测试搞懂位运算

    说明 我们平时在看JDK源码的过程中会看到开发者会大量的使用移位运算符,那么移位运算是怎么计算的呢?通过下文的测试代码就可以知道了. 测试代码 package com.leo.demo.otherte ...

  2. 一个关于文件中位运算的的处理函数。

    函数ReadDat()的功能是实现从文件IN88.DAT中读取一篇英文文章存入到字符串数组xx中.请编制函数CharConvA(),其功能是:以行为单位把字符串的最后一个字符的ASCii值右移4位后加 ...

  3. 农夫过河【数据结构实验报告】

    数据结构实验报告 实验名称:实验三 农夫过河 学号:*** 姓名:gnosed 实验日期:2017.10.30 一.实验目的 1.进一步掌握队列的使用 2.会使用队列进行农夫过河解的搜索 二.实验具体 ...

  4. java实现次方的运算_Java中对于位运算的优化以及运用与思考

    引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码.之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候 ...

  5. java取余位运算_Java中对于位运算的优化以及运用与思考

    引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码.之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候 ...

  6. 漫画:位运算技巧整理汇总+一道被嫌弃的题目

    (这首歌挺喜欢的...分享出来) 今天是小浩算法"365刷题计划"第65天.这两天总有人来问我,做公众号赚了多少钱,或者就是怎么能和你一样,2个月就做到7000粉丝.说实话,至少到 ...

  7. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  8. java的位运算的意义

    最近,由于工作原因在编写教材时,对java的位运算进行了深入了解,现记录如下.       首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符 ...

  9. C语言位运算农夫过河,位运算常见操作和农夫过河问题(C++实现)

    二进制常见操作 二进制数中 1 的个数 解法 1 用 n & 1 判断最右边一位是否为 1,右移之后继续判断最右边一位,重复直到 n = 0.时间复杂度为 O(log2n) #include ...

最新文章

  1. vbs 连接oracle 数据库,VBS访问、操作oracle数据库
  2. elasticsearch 索引存储深入详解
  3. ASP.NET Web实时消息后台服务器推送技术---GoEasy
  4. !+\v1 用来“判断浏览器类型”还是用来“IE判断版本”的问题!
  5. 问题解决:QtCreator屏蔽指定警告:如C4819等
  6. js 延迟几秒执行ifarme_Node.js调试之llnode篇
  7. 虚拟机“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
  8. vscode下载历史版本
  9. (附源码)spring boot小说网站系统 毕业设计 041446
  10. 不确定性管理,更需要领导力
  11. python外国网站爬虫_用python爬过这些网站,才敢说自己会爬虫!
  12. Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
  13. FOFA网络空间搜索引擎使用教程
  14. WHQL认证如何给驱动程序做数字签名
  15. 在Windows上挂载磁盘为非445端口的SAMBA服务(原创)
  16. GoldWave V5.55 绿色汉化版_声音编辑
  17. 是时候关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中
  18. 打卡第二天 树形DP初步
  19. 如何利用人工智能技术在零售业做产品创新——京东无人超市的成长之路
  20. 水泵橡胶软连接的相关知识

热门文章

  1. VJ—今年暑假不AC
  2. 传奇人物《周兴和》书连载23 劳燕分飞离故里
  3. 圆弧与直线相切画法_机械制图常识:圆弧连接画法
  4. 散列 pat1134
  5. 极智开发 | 华为云ECS本地开发环境搭建
  6. 广西大学计算机学院导师张振荣,广西大学硕士研究生导师简介-张振荣
  7. 沈从文《边城》中的“碾坊”与“渡船”、“车路”与“马路”
  8. 前列腺增生症的治疗行业调研报告 - 市场现状分析与发展前景预测
  9. 每日刷题记录(十六)
  10. Windows API函数大全---附:windows运行命令详解