题目链接
题意:
这里有n个同学围成了一个圈,1号选手手里有一个球,他可以选择左传或者是右传,求传递m次之后求回到1号选手的手中的情况有多少种。
思路:
传统的BFS会t,所以我们需要加上剪枝操作,即当判断这个球在第m次能否传到1号手中,能就继续,不能就return,但是剪枝优化之后依然会t,数据很小,所以我们需要打表操作(当然这不是正解)。正解是当然是DP,因为每次传球都只会有两种情况,左或右,所以我们只需要判断传递i次时到达某一个位置有多少种情况,而该位置的情况等于左边位置的情况与右边位置的情况之和,所以我们这需要两个循环跑出结果即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=2e5+5;
const int mod=998244353;
const int inf=0x7fffffff;
const double pi=3.1415926535;
using namespace std;
int flag[35][35];
signed main()
{
IOS;
int n,m;
cin>>n>>m;
flag[0][1]=1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j==1)
{
flag[i][j]=flag[i-1][n]+flag[i-1][2];
}
else if(j==n)
{
flag[i][j]=flag[i-1][1]+flag[i-1][n-1];
}
else
{
flag[i][j]=flag[i-1][j-1]+flag[i-1][j+1];
}
}
}
cout<<flag[m][1]<<endl;
return 0;
}