农夫过河问题(一个有趣的问题-位运算)
一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。问题是他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船。另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜或者狼和羊单独在河的一边,自己离开。请问农夫该采取什么方案才能将所有的东西运过河呢?
解答:
要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用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;
}
农夫过河问题(一个有趣的问题-位运算)相关推荐
- java位于算——一个测试搞懂位运算
说明 我们平时在看JDK源码的过程中会看到开发者会大量的使用移位运算符,那么移位运算是怎么计算的呢?通过下文的测试代码就可以知道了. 测试代码 package com.leo.demo.otherte ...
- 一个关于文件中位运算的的处理函数。
函数ReadDat()的功能是实现从文件IN88.DAT中读取一篇英文文章存入到字符串数组xx中.请编制函数CharConvA(),其功能是:以行为单位把字符串的最后一个字符的ASCii值右移4位后加 ...
- 农夫过河【数据结构实验报告】
数据结构实验报告 实验名称:实验三 农夫过河 学号:*** 姓名:gnosed 实验日期:2017.10.30 一.实验目的 1.进一步掌握队列的使用 2.会使用队列进行农夫过河解的搜索 二.实验具体 ...
- java实现次方的运算_Java中对于位运算的优化以及运用与思考
引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码.之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候 ...
- java取余位运算_Java中对于位运算的优化以及运用与思考
引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码.之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候 ...
- 漫画:位运算技巧整理汇总+一道被嫌弃的题目
(这首歌挺喜欢的...分享出来) 今天是小浩算法"365刷题计划"第65天.这两天总有人来问我,做公众号赚了多少钱,或者就是怎么能和你一样,2个月就做到7000粉丝.说实话,至少到 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- java的位运算的意义
最近,由于工作原因在编写教材时,对java的位运算进行了深入了解,现记录如下. 首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符 ...
- C语言位运算农夫过河,位运算常见操作和农夫过河问题(C++实现)
二进制常见操作 二进制数中 1 的个数 解法 1 用 n & 1 判断最右边一位是否为 1,右移之后继续判断最右边一位,重复直到 n = 0.时间复杂度为 O(log2n) #include ...
最新文章
- vbs 连接oracle 数据库,VBS访问、操作oracle数据库
- elasticsearch 索引存储深入详解
- ASP.NET Web实时消息后台服务器推送技术---GoEasy
- !+\v1 用来“判断浏览器类型”还是用来“IE判断版本”的问题!
- 问题解决:QtCreator屏蔽指定警告:如C4819等
- js 延迟几秒执行ifarme_Node.js调试之llnode篇
- 虚拟机“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
- vscode下载历史版本
- (附源码)spring boot小说网站系统 毕业设计 041446
- 不确定性管理,更需要领导力
- python外国网站爬虫_用python爬过这些网站,才敢说自己会爬虫!
- Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
- FOFA网络空间搜索引擎使用教程
- WHQL认证如何给驱动程序做数字签名
- 在Windows上挂载磁盘为非445端口的SAMBA服务(原创)
- GoldWave V5.55 绿色汉化版_声音编辑
- 是时候关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中
- 打卡第二天 树形DP初步
- 如何利用人工智能技术在零售业做产品创新——京东无人超市的成长之路
- 水泵橡胶软连接的相关知识
热门文章
- VJ—今年暑假不AC
- 传奇人物《周兴和》书连载23 劳燕分飞离故里
- 圆弧与直线相切画法_机械制图常识:圆弧连接画法
- 散列 pat1134
- 极智开发 | 华为云ECS本地开发环境搭建
- 广西大学计算机学院导师张振荣,广西大学硕士研究生导师简介-张振荣
- 沈从文《边城》中的“碾坊”与“渡船”、“车路”与“马路”
- 前列腺增生症的治疗行业调研报告 - 市场现状分析与发展前景预测
- 每日刷题记录(十六)
- Windows API函数大全---附:windows运行命令详解