草庐IT

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

Smoothzjc 2025-04-16 原文

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;
}


最后

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

有关算法设计与分析 SCAU19184 传球游戏的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  6. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  7. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  8. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  9. ruby-on-rails - Rails 5,公寓和设计 : sign in with subdomains are not working - 2

    我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的

  10. ruby-on-rails - 设计中的 ArgumentError::RegistrationsController#new 错误的参数数量(2 代表 0..1) - 2

    我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20

随机推荐