过河卒
过河卒
- 搜索?会爆的
- 因为棋盘的有序性和卒的移动的规则性,可以考虑递推:
- 卒只能从上方或左方的格子中来
- 卒一次只能移动一步
所以就可以写出递推方程了!:
- $f_{i,j} $ = \(f_{i-1,j}\) + \(f_{i,j-1}\);
- 边界条件: 马 所在点及马的控制点 : \(f_{i,j}\)=0
#include <iostream>
const int MAXN=20+1;
long long f[MAXN][MAXN];
inline bool control(int a,int b,int x,int y)
{
if((a==x-2&&b==y-1) || (a==x-2&&b==y+1) || (a==x-1&&b==y+2) || (a==x+1&&b==y+2) || (a==x+2&&b==y+1) || (a==x+2&&b==y-1) || (a==x+1&&b==y-2) || (a==x-1&&b==y-2))return true;
return false;
}
int main()
{
int n,m,x,y;
std::cin>>n>>m>>x>>y;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
{
if(i==0 && j==0)f[i][j]=1;
if((i==x && j==y) || control(i,j,x,y))f[x][y]=0;
else
{
if(i-1>=0)f[i][j]+=f[i-1][j];
if(j-1>=0)f[i][j]+=f[i][j-1];
}
}
std::cout<<f[n][m];
return 0;
}
一本通上说要用高精度,所以吓住了一直没做这道题,但今天发现好像不用高精度...莫非是我记错了?