洛谷P1002过河卒

dp水题,我都会做

我们考虑地图上i,j的位置可以怎么过来,因为卒只能向下或向右,所以当前位置只能由它的上方或左方转移过来,所以f[i][j]=f[i-1][j]+f[i][j-1],然后考虑边界情况,沿着上沿和左沿只能向一个方向走,所以f[i][0]=0,f[0][i]=0,这是不考虑有马的情况,当马加入图中后,我们要处理两种情况

1.马的活动范围不包括边缘,当马的活动范围不包括边缘时,我们只需要考虑当前点是不是马的活动范围再转移就好

2.马的活动范围包括边缘,我们发现,当一个点(i,0)或(0,i)在马的活动范围内时,i之后的(i+1~x,0)和(0,i+1~y)都不能走,所以方案数为0

代码

#include
#include
#include
#include
#include
using namespace std;
const int M=30;
long long int f[M][M];
int x,x2,y2,y;
bool jud(int sx,int sy)
{
	int fx[10][2]={{1,2},{2,1},{-1,-2},{-2,-1},{1,-2},{-1,2},{2,-1},{-2,1},{0,0}};
	for (int i=0;i<=8;i++)
	{
		int xx=sx+fx[i][0],yy=sy+fx[i][1];
		if (xx==x2&&yy==y2) return 0;
	}
	return 1;
}
int main()
{
	scanf("%d%d%d%d",&x,&y,&x2,&y2);f[0][0]=1;
	for (int i=1;i<=x;i++) if (jud(i,0)) f[i][0]=f[i-1][0];
	for (int i=1;i<=y;i++) if (jud(0,i)) f[0][i]=f[0][i-1];
	for (int i=1;i<=x;i++)
	for (int k=1;k<=y;k++)
	if (jud(i,k)) f[i][k]=f[i-1][k]+f[i][k-1];
	cout<

你可能感兴趣的:(动态规划)