首页 > 其他分享 >商人过河问题数学建模

商人过河问题数学建模

时间:2023-09-30 18:11:36浏览次数:35  
标签:随从 过河 int 商人 Tr 建模 flag 数学 Co

 

问题描述

三名商人各带–个随从乘船渡河,一只小船只能容纳二人,由他们自己划行.随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,商人们怎样才能安全渡河呢?

 

问题建模

考虑用深度优先搜索解决此问题,提前记录在船承载量为2时候,所有可行的移动状态,以及所有安全的商人和随从的数量情况,用变量同时在搜索的过程中记录答案,一旦找到左岸已经完全没有人的情况立刻结束搜索,输出方案

 

变量声明

Ans为记录步骤的数组

Move对于某次决策有哪些移动方法

Sav用于判断此时的状态是否安全

Boat 表示当前这一步船是过去还是回来

 

运行结果

    图片解释

  

共11步

  • 1 两个随从过去
  • 2 一个随从回来
  • 3 再两个随从过去
  • 4 一个随从回来
  • 5 两个商人过去
  • 6 一个随从和一个商人回来
  • 7 两个商人过去
  • 8 一个随从回来
  • 9 两个随从过去
  • 10 一个随从回来
  • 11 最后两个随从过去

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int Move[5][2]= {{0, 2}, {1, 1}, {2, 0}, {0, 1}, {1, 0}};//对于某次决策有哪些移动方法
 4 const bool Sav[4][4] = {{0, 0, 0, 0}, {1, 0, 1, 1}, {1, 1, 0, 1}, {0, 0, 0, 0}};//判断此时的状态是否安全
 5 int Ans[1001][2], step = 1;
 6 bool Boat[1001], flag;
 7 bool rep (int a, int b, bool flag) {//repeat函数,判断是否有重复状态 
 8     for(int i = 0; i < step; i ++) { 
 9         if(a == Ans[i][0] && b == Ans[i][1] && Boat[i] == flag) return 1;
10     }
11     return 0;
12 }
13 bool UnSave (int Tr, int Co, int flag) {
14     if (Tr < 0||Tr > 3||Co < 0||Co > 3|| Sav[Tr][Co] || rep(Tr, Co, flag)) return 1; 
15     return 0; 
16 }
17 //判断是否不安全的函数 
18 void dfs (int Trader, int Cortege) { //商人和随从 
19     if(!Trader && !Cortege) { //如果找到了方案立刻输出 
20         cout << step - 1 << endl; 
21         cout << "(左岸商人" << "," << "左岸随从)" <<" " << "(右岸商人" << "," << "右岸随从)" << endl; 
22         for (int i = 0;i < step; i++) { 
23             cout << "(" << Ans[i][0] << "," << Ans[i][1] << ") ";
24             cout << "(" << 3 - Ans[i][0] << "," << 3 - Ans[i][1] << ")" << endl;
25         }
26         exit(0); //找到答案,直接退出搜索 
27     }
28     else if (!flag) {
29         for (int i = 0; i <= 4; i ++) { 
30             Trader -= Move[i][0], Cortege -= Move[i][1];
31             if (UnSave(Trader, Cortege, flag)) { 
32                  Trader += Move[i][0], Cortege += Move[i][1]; 
33                 continue;
34             }
35             Ans[step][0] = Trader, Ans[step][1] = Cortege, Boat[step] = flag;
36             // 存储答案 
37             step ++, flag = (!flag);
38             dfs (Trader, Cortege);
39             flag = (!flag);
40             Trader += Move[i][0];
41             Cortege += Move[i][1];//回溯 
42             step --;
43         }         
44     }
45     //下面是划回去的状态,与上面同理 
46     else {
47         for (int i = 0;i <= 4;i ++) { 
48             Trader += Move[i][0];
49             Cortege += Move[i][1];
50             if (UnSave (Trader, Cortege, flag)) { 
51                 Trader -= Move[i][0], Cortege -= Move[i][1]; 
52                 continue;
53             }
54             Ans[step][0] = Trader, Ans[step][1] = Cortege, Boat[step] = flag;
55             step ++;
56             flag = (!flag);
57             dfs (Trader, Cortege);
58             flag = (!flag);
59             Trader -= Move[i][0];
60             Cortege -= Move[i][1];
61             step --;
62         }
63     }
64 }
65 int main() { 
66     Ans[0][0] = Ans[0][1] = 3, Boat[0] = 1;
67     dfs (3, 3);
68     return 0;
69 }

 

标签:随从,过河,int,商人,Tr,建模,flag,数学,Co
From: https://www.cnblogs.com/liujunxi/p/17738076.html

相关文章

  • 简单数学函数(最小公倍数与最大公约数与快速幂)
    最大公约数(\(gcd\)):intgcd(inta,intb){returnb?gcd(b,a%b):a;}最小公倍数(\(lcm\)):intlcm(inta,intb){returna/gcd(a,b)*b;//注意:除数为gcd(a,b)}快速幂:template<typenameA,typenameB,typenameC>Cpow(Ax,By,Cp){ if(x==......
  • 数学建模__动态规划
    动态规划就是,将任务每一步均记录下来,以便将来重复使用时能够直接调用问题描述:给定n个物品,每个物品的重量是Wi,价值是Vi,但是背包最多能装下capacity重量的物品,问我们如何选择才能利益最大化。这里涉及到建模过程,本文章主要讲解代码实现,建模过程较为简略。使用dp[i][j]来表示在容量为......
  • 数学建模__线性规划Python实现
    我使用到的是python库中scipy。'''线性规划'''#目标函数的系数#minz=2x1+3x2-5x3c=np.array([-2,-3,5])#不等式限制条件的系数,转化为小于等于#2x1-5x2+x3<=10,x1+3x2+x3<=12Aup=np.array([[-2,5,-1],[-1,-3,-1]])#必须是二维#右侧系数bup=np.array([-1......
  • 数学建模__非线性规划Python实现
    使用到的是scipy库线性规划指的是目标模型均为线性,除此以外的都是非线性规划,使用scipy提供的方法对该类问题进行求解。fromscipy.optimizeimportminimizeimportnumpyasnp#定义目标函数deffun(args):a,b,c,d=argsv=lambdax:(a+x[0])/(b+x[1])-c*x[0]......
  • 9.29闲话:9.24数学周练(第二次)拓展
    关于这张卷子呢,其实还是有点东西的,但是cxc上课讲的过于答辩,在这里写些题目的拓展解法和结论。T7(单选最后一题)题面解法求\(C_1\)到平面\(\alpha\)的距离,其实也就是求\(\overrightarrow{AC_1}\)在平面\(\alpha\)的法向量的投影的模长。而\(\overrightarrow{AC_1}=\ov......
  • 企业架构及流程管理咨询必备:ARIS企业流程建模工具
    在企业架构建设过程中,业务架构通常以流程梳理为重点,实现企业端到端流程贯通,并以此为基础整合管理体系,建立流程管理机制,形成一流的流程管理体系和标准文件体系,解决体系要求和业务操作两张皮的现象。随着企业的不断发展,业务流程管理如今已经在越来越多的企业中体现出管理价值。然而,众......
  • 数学最终讲义8-17章
    第8章第179页:第8章第180页:第8章第193页:第8章第194页:第8章第211页:第8章第215页:第11章第244页:第11章第247页:第11章第249页:第11章第250页:第11章第257页:第11章第269页:第12章第289页:第13章第304页:第13章第306页:第13章第317页:第14章第325页:第15章第350......
  • 数学分析问题
    1.构造连续函数$f:(0,1)\cap\mathbb{Q}\rightarrow[0,1]\cap\mathbb{Q}$,使得$f$是一一对应,并且$f^{-1}$连续。 2.设函数$f(x)$在$[0,1]$上定义,证明$f(x)$在不一致连续的充分必要条件是:$\exists\,M>0$及$[0,1]$上的序列$\{a_n\}$和$\{b_n\}$,使得$$\lim_{n\rightarrow\infty}\lef......
  • 数学筛法
    有的时候怕忘记,写篇小博客记录一下。线性筛素数inlinevoidinit(intn){for(inti=2;i<=n;i++){if(!vis[i])prime[++cnt]=i;for(intj=1;j<=cnt&&i*prime[j];j++){vis[i*prime[j]]=1;if(!(i%prime[j]))br......
  • 建模里AO是什么?为什么需要制作AO贴图?
    AO(环境漫反射光剔除,AmbientOcclusion)。在光照的位置确定的情况下,有的地方会被遮蔽,所以应该更暗一些。制作AO贴图就是为了更真实的反应光照对模型的明暗影响。但是假如光照的位置改变了呢?需要重新生成AO吗?所以诞生了SSAO(ScreenSpaceAO)……在世界空间,要考虑所有的光线和......