九度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 ...
随机推荐
- Spring获取properties文件中的属性
1.前言 本文主要是对这两篇blog的整理,感谢作者的分享 Spring使用程序方式读取properties文件 Spring通过@Value注解注入属性的几种方式 2.配置文件 applicatio ...
- 转:Hash, MAC,HMAC说明
from: http://www.cnblogs.com/songhan/archive/2012/07/29/2613898.html Hash, MAC,HMAC Hash-MD5, SHA-1, ...
- JavaSE入门学习18:Java面向对象之多态
一Java多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现.比方我们说"宠 物"这个对象.它就有非常多不同的表达或实现,比方有小猫.小狗.蜥 ...
- [Debug] Diagnose a Slow Page Using Developer Tools
Your page is showing high CPU usage and spinning up your laptop fan, but nothing is visibly happenin ...
- MockServer的测试思想与实现
转载:http://blog.csdn.net/shen1936/article/details/50298901 背景 什么是MOCK Mock的定义 Mock框架简介 Mock在单测中的应用 De ...
- Time.fixedDeltaTime 固定增量时间
static var fixedDeltaTime : float Description描述 The interval in seconds at which physics and other f ...
- 内容提供器(ContentProvider)
一.简介内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.目前,使 ...
- php-fpm添加service服务
原文:http://blog.csdn.net/whatday/article/details/50659992 php-fpm在5.3.2版本以后不支持service php-fpm start等命 ...
- Linux基础ls命令
ls 命令是linux下最常用的命令,通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等.ls 命令在日常的linux操作中用的 ...
- MVC进阶学习--View和Controller之间的数据传递(二)
1. 使用Request.Form MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交).在表单提交 ...