题解 P1002 【过河卒】

典型的递推题。。为了避免越界,把矩阵往右下移一下,我们知道一个点的走法数是它上面的点与左边的点的走法数之和(在最短路径情况下),剩下的毋须多言,要开long long!!

放代码

#include<bits/stdc++.h>
using namespace std;
long long jz[50][50],n,m,x,y;
int main()
{
	cin>>n>>m>>x>>y;
	n++;
	m++;
	x++;
	y++;//避免越界
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			jz[i][j]=-1;//标记为-1,其实0好像也行,不过得改代码
		}
	}
	if(x+2>=1&&y+1>=1)
		jz[x+2][y+1]=0;
	if(x+2>=1&&y-1>=1)
		jz[x+2][y-1]=0;
	if(x+1>=1&&y-2>=1)
		jz[x+1][y-2]=0;
	if(x+1>=1&&y+2>=1)
		jz[x+1][y+2]=0;
	if(x-1>=1&&y+2>=1)
		jz[x-1][y+2]=0;
	if(x-1>=1&&y-2>=1)
		jz[x-1][y-2]=0;
	if(x-2>=1&&y+1>=1)
		jz[x-2][y+1]=0;
	if(x-2>=1&&y-1>=1)
		jz[x-2][y-1]=0;
	jz[x][y]=0;//到这为止,暴力枚点
	int pdd=1;//顶行处理
	for(int i=1;i<=n;i++)
	{
		if(jz[i][1]!=0&&pdd==1)
			jz[i][1]=1;
		else
		{
			pdd=0;
			jz[i][1]=0;
		}
	}
	pdd=1;//顶列处理
	for(int i=1;i<=m;i++)
	{
		if(jz[1][i]!=0&&pdd==1)
		{
			jz[1][i]=1;	
		}			
		else
		{
			pdd=0;
			jz[1][i]=0;//碰到马占的点就把后面的点标记为0
		}
	}
	
	for(int i=2;i<=n;i++)
	{
		for(int j=2;j<=m;j++)
		{
			if(jz[i][j]==0)
			{
				continue;
			}
			else
			{
				jz[i][j]=jz[i-1][j]+jz[i][j-1];//老生常谈
			}
		}
	}
	cout<<jz[n][m];
}
posted @ 2018-12-27 21:46  G_A_TS  阅读(534)  评论(0编辑  收藏  举报