算法设计与分析 SCAU19184 传球游戏

news2024/11/27 1:31:45

19184 传球游戏

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

在这里插入图片描述

题型: 编程题 语言: G++;GCC;VC;JAVA

Description

n个同学站成一个圆圈,其中的一个同学手里拿着一个球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意)。
从1号同学手里开始传的球,传了m次以后,又回到1号同学手里,请问有多少种不同的传球方法。
两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。
比如有三个同学1号、2号、3号,球传了3次回到1号手里的方式有1->2->3->1和1->3->2->1,共2种。


输入格式

一行,有两个用空格隔开的整数n,m(3≤n≤30,1≤m≤30)。


输出格式

符合题意的方法数。


输入样例

3 3


输出样例

2


解题思路

一、深度优先搜索

解题思路

搜索即将所有情况列出来,每传到一个同学手中时,他都有两种选择,一个是往左传,一个是往右传,我们只要计算传到最后一次时是否传回第一个人手中即可。

类似于击鼓传花,只不过击鼓传花结束条件是时间到了,而这题的结束条件是传的次数到了

算法思路

  1. 递归的传参有两个,一个是记录传到第几次,一个是记录传到编号为几的人手上。
  2. 递归终止条件,达到第 m 次;如果此时符合条件(即传到第一个人手上),就将记录的 res 进行加一即可。
  3. 每次递归都有两种选择,一个是往左传,一个是往右传。
  4. 注意在编写第三步时,要分三种特殊情况,因为此题为圆圈,第一个人可以传到最后一个人手上,最后一个人可以传到第一个人手上。因此第一种情况是此时传到第一个人手中,第二种情况时此时传到最后一个人手中,第三种情况就是普通情况,传到中间任意一个人手中

补充

如果此题还要求输出传递的序列,那么便可新增一个记录序列的 nums 数组,在递归时同时压入 nums,且需要记得回溯即可(即还原状态)。



更多注释可查看下方的完整代码中,有助于理解

代码如下

#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <utility>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
/*
3 3
*/
using namespace std;
const int N = 1050;
const int inf = 1e9+7;
const int mod = 1e9+7;
const double pi = acos(-1.0);
const double eps = 1e-9;
typedef long long ll;

int n, m; // n 个同学传 m 次
int res = 0;

// cur 为传了几次,i 为传到序号为几的人手上
void dfs(int cur, int i) {
    if(cur == m + 1) {
        // 如果最后这次传回第1个人手上,则满足条件
        if(i == 1) {
            res++;
        }
        return;
    }

    // 由于是圈,第一个人的左手边是最后一个人
    if(i == 1) {
        dfs(cur + 1, n); // 传给左手边的人
        dfs(cur + 1, i + 1); // 传给右手边的人
    } else if(i == n) {
        // 由于是圈,最后一个人的右手边是第一个人
        dfs(cur + 1, i - 1); // 传给左手边的人
        dfs(cur + 1, 1); // 传给右手边的人
    } else{
        dfs(cur + 1, i - 1); // 传给左手边的人
        dfs(cur + 1, i + 1); // 传给右手边的人
    }

}


int main()
{
    cin >> n >> m;

    dfs(1, 1);
    cout << res << endl;

    return 0;
}


二、动态规划

1. dp 方程定义

  • a[i][j] 表示第 i 次传球传到 j 同学手里的方案数


2. 状态转移方程

当传到 j 同学手中时,传过来的位置有两种情况,一种是从左边即 j - 1,一种是从右边即 j + 1,因此 a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1]

但需要注意有特殊情况,第一个人左边是最后一个人,最后一个人右边是第一个人,所以特殊情况特殊处理即可。

  • 传到第一个人手中:a[i][j] = a[i - 1][2] + a[i - 1][n]
  • 传到最后一个人手中:a[i][j] = a[i - 1][n - 1] + a[i - 1][1]


代码如下

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int i,j,n,m,a[35][35]={0};
    cin>>n>>m;
    a[0][1]=1;
    for(i=1;i<=m;i++)
    { /**< a[i][j]表示第i次传球传到j同学手里的方案数 */
        for(j=1;j<=n;j++)
        {/**< a[i][j]=a[i-1][j-1]+a[i-1][j+1] */
            if(j==1)
                a[i][j]=a[i-1][2]+a[i-1][n];
            else if(j==n)
                a[i][j]=a[i-1][n-1]+a[i-1][1];
            else
                a[i][j]=a[i-1][j-1]+a[i-1][j+1];
        }
    }
    cout<<a[m][1];
    return 0;
}


最后

对我感兴趣的小伙伴可查看以下链接

  • 我的掘金主页:https://juejin.cn/user/1302297507801358
  • 博客主页:http://blog.zhangjiancong.top/
  • 公众号:Smooth前端成长记录

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

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

相关文章

制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Spring循环依赖

一、循环依赖全景图 二、什么是循环依赖问题&#xff1f; 1、什么是循环依赖&#xff1a; 类与类之间的依赖关系形成了闭环&#xff0c;就会导致循环依赖问题的产生。 比如下图中A类依赖了B类&#xff0c;B类依赖了C类&#xff0c;而最后C类又依赖了A类&#xff0c;这样就形…

免费分享一个springboot+vue学生选课管理系统,挺漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的springbootvue前后端分离的学生选课管理系统&#xff0c;分享下哈。 项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 项目部署 1. 将 studentms.sql…

如何将图片在线转换成文字?分享在线转换方法

怎么把图片转换成文字内容呢&#xff1f;大家在日常中使用的图片文件&#xff0c;很多时候都会拿来记录重要内容&#xff0c;如黑板上的文字来不及记下来就要被擦掉&#xff0c;演示的PPT文件没记完就换页了等操作&#xff0c;这就让我们很多小伙伴养成了用图片拍照或截图来记录…

Java案例——控制台实现QuickHit小游戏

一、需求概述 1.根据输入速率和正确率将玩家分为不同级别 2.级别越高&#xff0c;一次显示的字符数越多&#xff0c;玩家正确输入一次的得分也越高 3.规定时间内完成规定次数的输入&#xff0c;正确率达到规定要求&#xff0c;则升级 4.玩家最高级别为6级、初始级别一律为1…

chapter4——时钟分频器

目录同步整数分频器具有50%占空比的奇数整数分频非整数分频&#xff08;非50%占空比&#xff09;典型情况下SOC要对设计中各种组件提供许多与相位相关的时钟。将主时钟以2为幂次进行分割来产生同步偶数分频时钟&#xff0c;有时也会需要按奇数或小数进行分频。 同步整数分频器…

python推导式全局变量多参数传参装饰器

目录 一、推导式运用 二、全局变量 三、多参数传参 四、装饰器 一、推导式运用 # 推导式# for i in range(10): # print(i)# 创建列表 其中奇数位为1&#xff0c; 偶数位为0a[ i for i in range(10)] a2[ 1 if i %2 0 else 0 for i in range(10) ] print(a) print(a2) pr…

LEADTOOLS 入门教程: 使用文档转换器转换文件 - .NET Core

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

5款可以在学习和办公上提供帮助的软件

今天给大家推荐5个我自己也常用的软件&#xff0c;可以解决很多问题&#xff0c;给你的学习和办公带来巨大帮助。 1.文档检索启动——Listary 最近一直在整理文档&#xff0c;很多笔记和学案都已经不用了&#xff0c;想着进行一个归档&#xff0c;首先对磁盘进行了分区管理&a…

Spring 简介和基础使用

历史的选择 Spring 作为一个基础的框架&#xff0c;是在 Java EE 开发历史中&#xff0c;是成千上万公司选择。单独使用 Spring 的非常少了&#xff0c;很多都是用 Spring-Boot/Spring-Cloud 来开发&#xff0c;但是 Spring 基础依然是我们使用的基石。我们将一起来聊一聊 Spr…

算法竞赛入门【码蹄集进阶塔335题】(MT2301-2305)

算法竞赛入门【码蹄集进阶塔335题】(MT2301-2305&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2301-2305&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2301 47论2. MT2302 数的增殖3. MT2303 传染病4. MT…

笔试强训2

题目1&#xff1a; 倒置字符串_牛客题霸_牛客网 我们先写出代码&#xff1a; #include<iostream> #include<string> using namespace std; int main() {string s;getline(cin, s);reverse(s.begin(), s.end());auto start s.begin();while (start ! s.end()){au…

AS 打一个正式签名的包

如何打一个带正式签名文件的app (给自己的劳动成果冠名) 1. 选择build -> generate signed bundle/apk 2. 这里有两个选择, bundle or apk, 我们选择apk 于是勾选 apk, 并点下一步 3. 来到选择证书文件的地方, 但是我们这是第一次做, 还没有证书文件, 所以选择新建一个证…

车路协同云控平台建设实践

前言 随着汽车工业水平飞速发展&#xff0c;以及 IoT、5G、V2X 等信息通信技术的发展演进&#xff0c;通过汽车的智能化、网联化升级为大众带来更智能、更便捷的驾乘体验&#xff0c;成为汽车行业的发展趋势&#xff0c;自动驾驶、智能网联汽车成为行业热点。近年来&#xff0…

Dubbo集成Nacos作为注册中心

Nacos简介 什么是Nacos? Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#…

数据要素市场研究资料合集

编 辑&#xff1a;彭文华来 源&#xff1a;大数据架构师彭友们好&#xff0c;我是老彭。最近有个博士彭友在为论文挠头&#xff0c;到处找数据要素市场的资料。正好&#xff0c;国家工业信息安全发展研究中心刚刚发布《中国数据要素市场发展报告&#xff08;2021-2022&#xff…

智能合约介绍

介绍 智能合约是区块链实现可编程化的重要工具&#xff1b;在比特币时期&#xff0c;脚本仅限于描述交易得到内容和状态&#xff1b;随着智能合约的出现可以定义任何数据对象的状态擦欧总——>使其成为网络上的“法律条文”或者“商业共识”。相当于网络中的道德准则&#…

基于GIS的生态安全网络格局构建之主成分分析

来源&#xff1a;GIS前沿 一、数据来源介绍 &#xff08;一&#xff09;数字高程数据、归一化植被指数数据 本文所用到的松原市宁江区数字高程数据采用30 m分辨率的GDEMV 3数字高程数据、归一化植被指数数据采用250m分辨率的MYD13Q1植被指数16天合成产品&#xff0c;这些数据…

【零基础入门SpringMVC】第五期——报文、文件转移、拦截器、异常处理器

一、HttpMessageConverter 代表报文信息转化器&#xff0c;可以将请求报文转换为Java对象&#xff0c;也可以将Java对象转换为响应报文 请求报文分为三部分&#xff1a;请求头、请求空行和请求体 post 请求才会生成请求体get 请求会把请求信息拼接到地址后 概述&#xff1a;这…

经验分析:数据可视化工具入门讲解,如何应用数据可视化

什么是数据可视化&#xff1f;最核心的要点&#xff0c;就是解释数据、进行信息传递、压缩数据信息、突出整体观点。 在分析过程中&#xff0c;通过比较数据的大小、差异、分布&#xff0c;让其轻松呈现。 今天小编给大家介绍一款优秀的在线数据可视化软件。 项目是个人创建的…