九度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 ...
随机推荐
- ios开发中APP底部上滑不能调出如WiFi、蓝牙、播放等的设置页面的解决的方法
在开发的APP中我们通常通过手动底部上滑来调出WiFi.蓝牙.飞行模式等的设置页面.有时我们开发的APP无法调出. 解决的方法: 进入iPhone "设置" --> &quo ...
- CKEditor+SWFUpload实现功能较为强大的编辑器(一)---CKEditor配置
CKEditor爆表的强大功能大家都有目共睹,号称最强大的在线编辑器,只要将文件复制到项目中,在添加引用,在一句代码就可以将普通的textarea变成华丽的编辑器 所谓一复制,一拖,一换就大功告成 但 ...
- UI_UITableView_搭建
创建 tableView UITableViewStyle 有两种选择 #pragma mark - 创建 tableView - (void)createTableView { // 枚举类型共同拥 ...
- C#如何改变字符串编码
public string UTF8ToGB2312(string str) { try { Encod ...
- PS 如何制作环绕文字效果
最终效果 地球素材 1.打开素材,使用椭圆选区工具按住shift绘制正圆选区 2.转到路径面板,将选区变为工作路径 3.选择文字工具,在路径上输入文字 4.ctrl+T,按住ctrl+alt,鼠标拖动 ...
- Eclipse对于多个Java项目的支持并不友好!
本文吐槽! 如果我们创建两个Java项目.一个叫StatsReader.把数据从网上下载到本地数据库里.一个叫StatsViewer.把数据从数据库里拿出来呈现给用户.这两个项目都要用同一个外部类库m ...
- C3:建造者模式 Builder
将一个复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示. 应用场景: A.创建这个对象通常需要较多的参数,才能完整的表示该对象.B.类的各个组成部分的具体实现类或算法经常面临变化,但将他 ...
- Django——Model的使用
Model使用 首先安装MySQL的python连接驱动,windows下安装可下下载,对应python-2.7: https://code.google.com/p/soemin/downloads ...
- c#关于int(或其他类型)的字段在对象初始化时默认初始化问题的解决方法
问题: c#的wcf服务接口在后台通过自定义对象接收前台参数的时候,前台参数即使不传int类型的字段值,后台也会默认初始化为0,由于很多表示状态的int字段都是从0开始的,导致查询的时候有些不想参与查 ...
- [DevExpress]TreeListLookUpEdit带checkbox之经典运用
上代码: public partial class TreeListLookUpEdit : DevExpress.XtraEditors.XtraForm { private string _Key ...