1. 程式人生 > >【題解】傳球遊戲

【題解】傳球遊戲

順序 include 規則 display 題解 cst math lap 一起

題目描述

上體育課的時候,小蠻的老師經常帶著和同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手裏拿著一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同學就要給大家表演一個節目。

聰明的小蠻提出一個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裏開始傳的球,傳了m次以後,又回到小蠻手裏。兩種傳球方法被視為不同的方法,當且僅當著兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有三個同學1號、2號、3號,並假設小蠻為1號,球傳了3次回到小蠻手裏的方式有1→2→3→1和1→3→2→1,共2種。

輸入格式

一行,有兩個用空格隔開的整數n,m(3≤n≤30,1≤m≤30)。

輸出格式

一個整數,表示符合題意的方法數。

輸入樣例

3 3

輸出樣例

2

數據規模

對於40%的數據:3≤n≤30,1≤m≤20;

對於100%的數據:3≤n≤30,1≤m≤30。

題解

數據很小,兩重循環暴力dp即可。

技術分享圖片
#include <iostream>
#include 
<fstream> #include <algorithm> #include <cstdio> #include <cmath> #define MAXN 31 #define MAXM 31 using namespace std; int n, m; int a[MAXM][MAXN]; int main() { cin >> n >> m; a[0][1] = 1; for(register int i = 1; i <= m; i++) {
for(register int j = 1; j <= n; j++) { if(j == 1) a[i][j] = a[i - 1][2] + a[i - 1][n]; else if(j == n) a[i][j] = a[i - 1][1] + a[i - 1][n - 1]; else a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1]; // 第i次傳球中第j個人會接到左邊和右邊傳來的球 } } cout << a[m][1]; return 0; }
參考程序

【題解】傳球遊戲