算法设计与分析-分支限界——沐雨先生

news2024/11/15 18:21:33

(1)抓奶牛问题描述:

农夫约翰被告知逃跑的奶牛的位置,并且要求立即去抓住它。约翰开始的位置在数轴上位置 N ( 0 ≤ N ≤ 100) ,而奶牛的位置在同样一个数轴上的 K (0 ≤ K ≤ 100) 。约翰有两种移动方式:步行和瞬间移动。

  • 步行 : 从任意一点 X 移动到 X+1 或者 X-1 ,花一分钟。
  • 瞬间移动 : 从任意一点 X 移动到 2X ,花一分钟。
    如果奶牛没有意识到被抓捕,也就不会移动,过多久农夫会抓到奶牛?

输入

一行:用空格分开的两个整数: N 和 K

输出

一行 : 农夫抓到奶牛需要的最少分钟数。

例子输入

5 17

例子输出

4(农夫最快的抓捕路径是 5-10-9-18-17, 用时 4 分钟)

建立抓奶牛问题的解题思路

农夫和奶牛的距离是我们判断农夫抓住奶牛的依据,我们是可以很容易得到的,但农夫每一次都有3种选择,X+1,X-1,2X我们都要考虑并把每种情况发生后农夫与奶牛的距离记录下来,在做了这次选择后还没有抓住奶牛的话,再继续考虑下一个3种选择,在这个过程中,我们相当于搜索一颗完全的3叉树,但我们可以剪掉一些枝叶,例如在农夫的位置大于奶牛的位置的时候我们就不可能再去搜索它的下一层的X+1和2X的位置,如果这样就只能越来越远了。在搜索中程序第一次搜索到农夫与奶牛的距离为0时结束,这表示农夫抓住了奶牛。
分枝限界法与解空间树的广度优先遍历算法极为相似。唯一的不同之处是分枝限界法不搜索以不可行结点为根的子树。

程序截图

在这里插入图片描述
在这里插入图片描述

(2)实验题目: 部落卫队问题

原始部落 Byteland 中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何两个人都不是仇敌。

[ 输入说明 ]

第一行给出居民数 n 和仇敌关系数 m ;下面的 m 行给出每一个仇敌关系,仇敌关系 u 和 v 表示居民 u 和 v 是仇敌。

[ 输出说明 ]

第一行给出部落卫队人数,第二行是卫队组成, 1 代表对应居民在卫队中, 0 代表对应居民不在卫队中

[ 分支限界法分析 ]

把部落的每个人看作是无向图的一个顶点 , 敌对关系看作是无向图的一条边 , 因此 , 该问题可以转化为求一个无向图顶点数最多的独立集 。而分支限界法是基于广度优先的搜索算法,根据广度优先算法的最优性可知,分支限界法一定可以得出一个无向图顶点数最多的独立集。

[ 参考输入、输出、结果 ]

输入 :部落人数: 7

敌对关系数: 10
敌对关系为 : 1 , 2 1,4 2,3 2,4 2,5 2,6 3,5 3,6 4 ,5 5,6

输出 :卫队人数为:3

卫队成员为【1,0,1,0,0,0,1】
在这里插入图片描述
在这里插入图片描述

源程序

(1)

###include<iostream>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=100010;

int bfs(int s,int t)
{
    queue<int> q;
    int head,next;
    int vis[M],step[M];
    memset(vis,0,sizeof(vis));
    memset(step,0,sizeof(step));
    q.push(s);
    step[s]=0;
    
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        for(int i=0;i<3;i++)
        {
            if(i==0)
                next=head-1;
            if(i==1)
                next=head+1;
            if(i==2)
                next=head*2;
            if(next<0||next>M)
                continue;
            if(vis[next]==0)
            {
                vis[next]++;
                step[next]=step[head]+1;
                q.push(next);
            }
            if(next==t)
                return step[next];
        }
    }
}


int main()
{
    int s,t;			
	printf("请输入约翰开始的位置在数轴上位置N和奶牛的位置:");
    while(scanf("%d %d",&s,&t)==2&&s>=0&&t<=M)
    {
        if(t<=s)//牛在人后面 
            cout<<abs(s-t)<<endl;
        else 
            cout<<bfs(s,t)<<endl;
    }
    
    return 0;
}

(2)

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int search(int);
int maxx=0,sum;
int cd[20][20];
bool b[20],g[20];
int pd(int);
int n,c,x,y;
int main() {

    scanf("%d%d",&n,&c);//输入
    for(int i=1; i<=c; i++) {
        scanf("%d%d",&x,&y);
        cd[x][y]=cd[y][x]=1;//互相是敌人标记1
    }
    search(1);//加入第一个人
    cout<<maxx<<endl;
    for(i=1; i<=n; i++)
        cout<<g[i]<<" ";//输出是否加入
    cout<<endl;
    return 0;
}
int search(int x) {
    for(int i=1; i<=n; i++) {
        if(!b[i]) { //没有加入
            if(pd(i)) {    //判断已经加入的人中是否有他的仇敌
                b[i]=1;    //加入队伍,加入的人数加1
                sum++;
            }
            if(x==n) { //全都加完
                if(sum>maxx)
                    maxx=sum;//找最大值
                for(int i=1; i<=n; i++)
                    g[i]=b[i];//记录答案
            } else {
                search(x+1);//找下一个
                b[i]=0;//回溯(回溯注意在else里)
                sum--;
            }

        }
    }
	return 0;
}
int pd(int x) {
    for(int i=1; i<=n; i++) {
        if(b[i]&&cd[x][i])//判断与已经加入的人是否是仇敌
            return 0;
    }
    return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1539003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

普洛斯怀来数据中心获Uptime MO认证,以高品质服务持续提升客户体验

近日&#xff0c;普洛斯怀来数据中心顺利通过Uptime M&O&#xff08;运维与管理&#xff09;认证&#xff0c;获得Uptime Institute颁发的认证证书。普洛斯数据中心致力于为客户提供高品质、高可靠的运维服务&#xff0c;此项认证&#xff0c;标志着普洛斯数据中心运营及管…

Mac上玩《赛博朋克2077》mac电脑怎么玩这个游戏

X用户crushovitz_b最近发现&#xff0c;在《赛博朋克2077》游戏主菜单页面&#xff0c;将鼠标停在版本号选项卡上面足够长时间&#xff0c;就会发现游戏当前的版本号由2.12变为了2.0.77&#xff0c;这是对游戏标题2077的致敬彩蛋。 《赛博朋克2077》的叙事总监兼续集副总监Pawe…

Flutter 事件传递简单概述、事件冒泡、事件穿透

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 本文对 事件传递只做 简单概述&#xff0c;主要讲解&#xff0c;事件传递过程中可能遇到的问题解决&#xff0c;比如 事件冒泡、事件穿透&#xff1b; 不是我偷懒&#xff0c;是自认为没有这几位写的详细、仔细&#xff0c…

FPGA学习_时序分析

文章目录 前言一、组合逻辑与时序逻辑二、建立时间和保持时间三、建立时间和保持时间 前言 心中有电路&#xff0c;下笔自然神&#xff01;&#xff01;&#xff01; 一、组合逻辑与时序逻辑 组合逻辑&#xff1a;没有时钟控制的数字电路&#xff0c;代码里的判断逻辑都是组…

颠覆传统:Web3如何塑造未来的数字经济

引言 近年来&#xff0c;随着数字化时代的到来&#xff0c;互联网已经成为人们生活中不可或缺的一部分。然而&#xff0c;随着技术的不断发展和社会的不断变迁&#xff0c;传统的Web2模式逐渐显露出一些弊端&#xff0c;如数据垄断、隐私泄露等问题&#xff0c;这促使人们寻求…

简历指导与模板获取

简历是应聘过程当中最重要的材料&#xff0c;是我们在求职市场的一张名片&#xff0c;一份好的简历能够吸引招聘者的注意&#xff0c;使你在竞争激烈的求职市场中脱颖而出。 1.简历指导 以下是一份典型简历的主要部分和常见内容&#xff1a; 联系信息&#xff1a; 包括你的全…

设计模式 适配器模式

1.背景 适配器模式&#xff0c;这个模式也很简单&#xff0c;你笔记本上的那个拖在外面的黑盒子就是个适配器&#xff0c;一般你在中国能用&#xff0c;在日本也能用&#xff0c;虽然两个国家的的电源电压不同&#xff0c;中国是 220V&#xff0c;日本是 110V&#xff0c;但是这…

操作系统面经-什么是操作系统?

通过以下四点可以概括操作系统到底是什么&#xff1a; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;主要用于管理计算机硬…

DP:路径规划模型

创作不易&#xff0c;感谢三连支持&#xff01; 路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。大多需要用二维dp数组去实现 一、不同路径 . - 力扣&#xff08;LeetCode&#xff09;不同路径 class Solution { public:int uniquePath…

自动驾驶---Motion Planning之轨迹Path优化

1 背景 在之前的几篇文章中,不管是通过构建SL图《自动驾驶---Motion Planning之Path Boundary》,ST图《自动驾驶---Motion Planning之Speed Boundary》,又或者是构建SLT图《自动驾驶---Motion Planning之构建SLT Driving Corridor》,最终我们都是为了得到boundary的信息。 …

基于springboot的4S店车辆管理系统

基于springboot的4S店车辆管理系统 的设计和实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

算法-最短路径

图的最短路径问题是一个经典的计算机科学和运筹学问题&#xff0c;旨在找到图中两个顶点之间的最短路径。这种问题在多种场景中都有应用&#xff0c;如网络路由、地图导航等。 解决图的最短路径问题有多种算法&#xff0c;其中最著名的包括&#xff1a; 1.迪杰斯特拉算法 (1).…

抖音小店怎么定类目?分享几个爆单几率大,适合新手的细分类目!

大家好&#xff0c;我是电商糖果 做电商的应该经常听过这么一句话&#xff0c;类目大于一切&#xff01; 好的类目可以让商家减少很多竞争和难题。 糖果做电商有很多年了&#xff0c;我一直认为做店前期最难的定类目&#xff0c;中期是选品&#xff0c;后期是维护店铺。 如…

物联网数据报表分析

随着物联网技术的迅猛发展&#xff0c;越来越多的企业开始将物联网解决方案应用于各个领域&#xff0c;从提高生产效率到优化用户体验&#xff0c;物联网都发挥着至关重要的作用。然而&#xff0c;如何有效地分析和管理物联网产生的海量数据&#xff0c;成为企业面临的挑战之一…

【Java开发过程中的流程图】

流程图由一系列的图形符号和箭头组成&#xff0c;每个符号代表一个特定的操作或决策。下面是一些常见的流程图符号及其含义&#xff1a; 开始/结束符号&#xff08;圆形&#xff09;&#xff1a;表示程序的开始和结束点。 过程/操作符号&#xff08;矩形&#xff09;&#xff…

<Linux> 生产者消费者模型

目录 前言&#xff1a; 一、什么是生产者消费者模型 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;生产者消费者之间的关系 &#xff08;三&#xff09;生产者消费者模型特点 &#xff08;四&#xff09;生产者消费者模型的优点 二、基于阻塞队列实现生产…

《定时执行专家》:Nircmd 的超级搭档,解锁自动化新境界

目录 Nircmd 简介 《定时执行专家》与 Nircmd 的结合 示例&#xff1a; 自动清理电脑垃圾: 定时发送邮件: 定时关闭电脑: 《定时执行专家》的优势: 总结: 以下是一些其他使用示例&#xff1a; 立即下载《定时执行专家》&#xff1a; Nircmd 官方网站&#xff1a; 更…

代码随想录阅读笔记-栈与队列【用队列实现栈】

题目 使用队列实现栈的下列操作&#xff1a; push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言…

普发Pfeiffer镀膜机Classic580-500SP Spider600 全套资料包含操作使用说明

普发Pfeiffer镀膜机Classic580-500SP Spider600 全套资料包含操作使用说明

LeetCode---126双周赛

题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求&#xff0c;直接模拟即可&#xff0c;代码如下 class Solution { public:int sumOfEncryptedInt…