过河卒

过河卒

  • 搜索?会爆的
  • 因为棋盘的有序性和卒的移动的规则性,可以考虑递推:
    • 卒只能从上方或左方的格子中来
    • 卒一次只能移动一步

所以就可以写出递推方程了!:

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

一本通上说要用高精度,所以吓住了一直没做这道题,但今天发现好像不用高精度...莫非是我记错了?

posted @ 2018-07-14 08:42  昤昽  阅读(201)  评论(1编辑  收藏  举报