问题描述:
3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人。在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过河顺序才能让所有人都安全地过到河的另一边。

详细过程参见《数学模型》第四版(姜启源)

#include <cstdio>
#define maxn 101
int num;//number of bus or fol
int graph[maxn*maxn][maxn*maxn];
int state[maxn][maxn]; //when cross river
int c_bus[5] = {2, 1, 0, 1, 0};
int c_fol[5] = {0, 1, 2, 0, 1};
int b_step[maxn*maxn];
int f_step[maxn*maxn]; bool flag = false;
void DFS(int bus, int fol, int step, int dir)
{
b_step[step] = bus, f_step[step] = fol;
if(bus == 0 && fol == 0)
{
for(int i = 0; i <= step; i++)
{
printf("(%d,%d)", b_step[i], f_step[i]);
if(i != step )
printf(" -> ");
}
printf("\n");
flag = true;
}
int fa = bus * ( num + 1 ) + fol;
for(int i = 0; i < 5; i++)
{
if(dir)
{
int b_next = bus - c_bus[i], f_next = fol - c_fol[i];
if(b_next >= 0 && b_next < num+1 && f_next >= 0 && f_next < num + 1 && state[b_next][f_next])
{
int son = b_next * ( num + 1 ) + f_next;
if(!graph[fa][son] && !graph[son][fa])
{
graph[fa][son] = 1;
graph[son][fa] = 1;
DFS(b_next, f_next, step + 1, !dir);
graph[fa][son] = 0;
graph[fa][son] = 0;
}
}
}
else
{
int b_next = bus + c_bus[i], f_next = fol + c_fol[i];
if(b_next >= 0 && b_next < num + 1 && f_next >= 0 && f_next < num + 1 && state[b_next][f_next])
{
int son = b_next * ( num + 1) + f_next;
if(!graph[fa][son] && !graph[son][fa])
{
graph[fa][son] = 1;
graph[son][fa] = 1;
DFS(b_next, f_next, step + 1, !dir);
graph[fa][son] = 0;
graph[fa][son] = 0;
}
}
}
}
}
int main()
{
printf("Please input the number of the businessman: ");
scanf("%d",&num);
for(int i = 0; i < num + 1; i++)
{
state[i][0] = 1;
state[i][num] = 1;
state[i][i] = 1;
}
DFS(num, num, 0, 1);
if(!flag)
printf("they can't cross the river.");
}

  

商人过河问题(DFS)的更多相关文章

  1. 商人过河问题(二)java实现

    本文实现的java版商人过河是参考http://wenku.baidu.com/link?url=dpe2AC8mCjpGnclFv6iZy88_vqYm3bED4QDpSkAI4ssgs7Bhntu ...

  2. SDUT 1265-马停下过河卒(DFS)

    马拦过河卒 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit3000ms Memory Limit 65536K ...

  3. NOIP2002 过河卒(DFS,DP)

    https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如 ...

  4. ACM题目————马拦过河卒

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  5. BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

    好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SP ...

  6. [luogu P2294] [HNOI2005]狡猾的商人

    [luogu P2294] [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据, ...

  7. 【openjudge】【递推】例3.6 过河卒(Noip2002)

    [题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...

  8. YCOJ过河卒C++

    过河卒是一道~~较简单 的问题,用递归或者动态规划都可以完成,但今天主要不是递归或者动态规划,而是用深度优先搜索做的.虽然会有两组TLE~~ 深搜是一种向下搜索的算法(如图所示) 它能有效的统计中点到 ...

  9. Java实现 LeetCode 403 青蛙过河

    403. 青蛙过河 一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...

随机推荐

  1. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  2. highcharts 时间少8小时问题

    Highcharts 中默认开启了UTC(世界标准时间),由于中国所在时区为+8,所以经过 Highcharts 的处理后会减去8个小时. 如果不想使用 UTC,有2种方法可供使用: 1.在使用Hig ...

  3. 20145330《Java程序设计》第三周学习总结

    20145330 <Java程序设计>第三周学习总结 第三周知识的难度已经逐步上升,并且一周学习两章学习压力也逐渐加大,需要更高效率的来完成学习内容,合理安排时间. 类与对象 对象(Obj ...

  4. PHP 高效分布代码转的

    在<efficient pagination using mysql>中提出的clue方式. 利用clue方法,给翻页提供一些线索,比如还是SELECT * FROM `csdn` ord ...

  5. Android中Activity的四种启动模式

    要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...

  6. 启动tomcat,报java.lang.NoClassDefFoundError

    用的Build Path加进来的jar包,没有读取到,应该讲jar包放在lib目录下

  7. html5.js让IE(包括IE6)支持HTML5元素方法

    引用Google的html5.js文件 <!--[if IE]> <script src=”http://html5shiv.googlecode.com/svn/trunk/htm ...

  8. SQL serve 聚合函数、字符串函数

    1.聚合函数 sum,avg,max,min,count        having后面只能跟聚合函数 2.数学函数和字符串函数 3.练习: 1)新建一个学生信息表,根据问题写出程序. 2)新建一个超 ...

  9. Eclipse安装jad插件进行反编译

    1.下载的eclipse是免安装的工具: 打开eclipse后在windows-preference下没有找到jadClipse,希望显示这个插件: 方法一:Help-Eclipse Marketpl ...

  10. 关闭SSMS的事务自动提交,改为手动提交

    SQLServer 2005-2008-2012使用Oracle时,默认是手动提交.而SQLServer2005中,默认是自动提交,但是SQLServer支持配置. 方法: 用SSMS连接到SQL S ...