九度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 ...
随机推荐
- http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
- redis批量删除多个keys
Redis的官网redis.io,大家可以查看很多命令的使用方法 说明:删除单个key比较简单,直接使用命令del xxxkey,批量删除多个keys可利用如下命令: 假设:redis的安装目录如下: ...
- 2017.7.18 windows下ELK环境搭建
参考来自:Windows环境下ELK平台的搭建 另一篇博文:2017.7.18 linux下ELK环境搭建 0 版本说明 因为ELK从5.0开始只支持jdk 1.8,但是项目中使用的是JDK 1.7, ...
- QT静态库和动态库的导出
因为静态库是不须要导出的.所以在写QT的前置声明的时候须要说明 #if defined(QT_SHARED) #ifdef COMMONLIB #define COMMONLIB_EXPORT Q_D ...
- 用Jmeter对数据库执行压力测试
转载:http://www.cnblogs.com/chengtch/p/6198900.html 在我看来压力测试的压测对象可以分为UI,接口及数据库三个部分吧,对界面及接口进行压测还算熟悉, 定位 ...
- 系统重装 U盘安装XP操作系统开机出现提示txtsetup.sif怎么办
你的这个问题 是安装xp时把xp做成u盘出现的 原因是xp没有在根本上支持这种安装 到win7后才支持的 解决方法有以下几种 1,刻录成cd 2重新下载xp ghost版的不会出现这个问题 3证实Ul ...
- android:Cordova Android, hello Cordova ,PhoneGap android
文章来自:http://blog.csdn.net/intbird 官方文档: http://cordova.apache.org/docs/en/5.0.0//index.html intbird的 ...
- S2:外观模式 Facade
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 什么时候使用:1,开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口.2,维护一个大 ...
- 自动化统一安装部署tomcat
背景:多台服务器来回切换,安装部署tomcat,浪费时间 目的: 一次修改,统一安装,统一部署. 进程:ps -ef|grep tomcat|grep -v 'grep'|awk '{print $2 ...
- Vue mixins extend
const mixins = { created () { console.log('mixins created') } } const mixins2 = { created () { conso ...