九度OJ 1204:农夫、羊、菜和狼的故事 (遍历、BFS)
时间限制:1 秒
内存限制:32 兆
特殊判题:是
提交:744
解决:502
- 题目描述:
-
有一个农夫带一只羊、一筐菜和一只狼过河.
果没有农夫看管,则狼要吃羊,羊要吃菜.
但是船很小,只够农夫带一样东西过河。
问农夫该如何解此难题?
- 输入:
-
题目没有任何输入。
- 输出:
-
题目可能有种解决方法,求出步骤最少的解决方法,
按顺序输出农夫想把羊、菜、狼全部运过河需要哪几个步骤。
如果需要将羊带过河去则输出“sheep_go”。
如果需要将羊带回来则输出“sheep_come”。
如果需要将菜带过河去则输出“vegetable_go”。
如果需要将菜带回来则输出“vegetable_come”。
如果需要将狼带过河去则输出“wolf_go”。
如果需要将狼带回来则输出“wolf_come”。
如果需要空手返回则输出“nothing_come”。
如果需要空手过河则输出“nothing_go”。
每输出一种方案,输出一行“succeed”。
- 样例输入:
- 样例输出:
- 提示:
-
题目可能有多组解决方法,每种方法输出后要再空一行。
一种方法中的多句话,每句话占一行。
思路:
4个变量分别表示人和所带东西的状态,在河对岸则为1,否则为0。那么该题的初始状态是(0, 0, 0, 0),终止状态是(1, 1, 1, 1)。
由于要求的是最短步骤,应该用BFS。状态变换的规则是每次只能农夫或带任意东西过河。
我只用了1个变量,其低4位表示4个人或东西的状态。开始想取巧,但对位操作并不熟练,因而并未更优。
代码:
#include <stdio.h>
#include <string.h> #define M 16 int beginState;
int endState;
int state[M], v[M];
int best[M], lest; void init()
{
beginState = 0;
endState = M-1;
state[0] = beginState;
memset(v, 0, sizeof(v));
v[beginState] = 1;
lest = M+1;
} int bit(int i, int b)
{
return (i>>b)&1;
} int move(int count)
{
int s = state[count-1];
if (s == endState)
{
if (count < lest)
{
lest = count;
//printf("=====\n");
for (int i=0; i<count; i++)
{
best[i] = state[i];
// printf("%d%d%d%d\n", bit(best[i],3), bit(best[i],2),
// bit(best[i],1), bit(best[i],0));
}
//printf("=====\n");
}
return count;
}
if (count == M)
return M+1;
int i, t;
for (i=0; i<M; i++)
{
if (v[i])
continue;
if (s/8 == i/8)
continue;
if (s/8 == 1)
{
t = s-8;
int flag = 0;
if (t == i)
flag = 1;
if (bit(t,0) && t-1 == i)
flag = 1;
if (bit(t,1) && t-2 == i)
flag = 1;
if (bit(t,2) && t-4 == i)
flag = 1;
if (flag == 0)
continue;
}
else
{
t = s+8;
int flag = 0;
if (t == i)
flag = 1;
if (bit(i,0) && t+1 == i)
flag = 1;
if (bit(i,1) && t+2 == i)
flag = 1;
if (bit(i,2) && t+4 == i)
flag = 1;
if (flag == 0)
continue;
}
if (bit(i,3)^bit(i,1))
{
if ((bit(i,3)^bit(i,0)) || (bit(i,3)^bit(i,2)))
continue;
}
state[count] = i;
v[i] = 1;
int step = move(count+1);
if (step <= M)
return step;
v[i] = 0;
}
return M+1;
} void printBest()
{
int s0, s, t;
s0 = best[0];
for (int i=1; i<lest; i++)
{
s = best[i];
if (bit(s,3))
{
t = s-s0;
if (t == 8)
printf("nothing_go\n");
if (bit(t, 0))
printf("vegetable_go\n");
if (bit(t, 1))
printf("sheep_go\n");
if (bit(t, 2))
printf("wolf_go\n");
}
else
{
t = s0-s;
if (t == 8)
printf("nothing_come\n");
if (bit(t, 0))
printf("vegetable_come\n");
if (bit(t, 1))
printf("sheep_come\n");
if (bit(t, 2))
printf("wolf_come\n");
}
s0 = s;
}
printf("succeed\n\n");
} int main(void)
{
init(); move(1); printBest(); return 0;
}
/**************************************************************
Problem: 1204
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:908 kb
****************************************************************/
九度OJ 1204:农夫、羊、菜和狼的故事 (遍历、BFS)的更多相关文章
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- 关于hibernate中映射中有many to one等外键关联时的问题
hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient insta ...
- 前端JS利用canvas的drawImage()对图片进行压缩
对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致 ...
- 新人补钙系列教程之:体验ApplicationDomain 应用程序域
要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...
- Java高级特性—消息队列
1)什么是jms JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API. 它便于消息系统中的Java应用程序进行消息 ...
- 转:mybatis3中@SelectProvider的使用技巧
mybatis3中@SelectProvider的使用技巧 mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. mybati ...
- 使navicat可以通过SSH连接MySQL数据库
1.编辑/etc/ssh/sshd_config,在最下面添加如下语句 KexAlgorithms diffie-hellman-group1-sha1,curve25519-sha256@libss ...
- 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
出现这种错误的时候,我把一套测试完好的电机和驱动器,直接把跟电机连接的线拔掉换另一个电机,驱动器所有参数不变,这样由于是绝对值编码器的,所以驱动器已经记住了上一个电机的圈数,换了新的电机之后圈数不对了 ...
- 系统重装 JUJUMAO VHD安装WIN7解析
1 把原有系统分区一个删除(使用第三方分区工具如PM或者PQ)并新建一个系统分区(也可以同时新建其他分区如D盘,E盘,但是一定要把C盘设置为NTFS格式并且活动的!) 2 将JUJUMAO_VHD ...
- File:方法(具体)
File方法: Name()方法:获取File的名称. getPath()方法:获取File的路径. getAbsolutePath()方法:获取文件或文件夹的绝对路径名称. getParent()方 ...
- Oracle基础 程序包
一.程序包 程序包是一种数据库对象,它是对相关PLSQL类型.子程序.游标.异常.变量和常量的封装.程序包包含两部分内容: 1.程序包规范:可以声明类型.变量.常量.异常.游标和子程序. 2.程序包主 ...