http://www.rqnoj.cn/Problem_69.html
坐标DP问题,本题比较简单,动规方程dp[i][j] = dp[i-1][j] + dp[i][j-1] ,对于特殊的点,只需要判断一下,然后赋值为0即可。虽然数据规模比较小,但是结果却比较大,需要用long long存储,同时输出的时候用%I64d输出,用%lld出错。代码如下:
/*
ID: csuchenan
PROG: 过河卒
LANG: C++
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
const int maxn = 30 ;
long long dp[maxn][maxn] ;
int dir[8][2] ={{-2 , 1} , {-1 , 2} , {1, 2} , {2 , 1} ,
{2 , -1} , {1 , -2} ,{-1 ,-2} ,{-2,-1}
};
int n ;
int m ;
int x ;
int y ;
bool judge(int i , int j)
{
int k ;
if(i==x && y==j)
return 0 ;
for(k = 0 ; k < 8 ; k ++)
{
if(x + dir[k][0] == i && y + dir[k][1] == j)
return 0 ;
}
return 1 ;
}
int main()
{
while(scanf("%d %d %d %d" , &n , &m , &x , &y)!=EOF)
{
int i ;
int j ;
memset(dp , 0 , sizeof(dp)) ;
dp[0][0] = 1 ;
for(i = 0 ; i <= n ; i ++)
{
for(j = 0 ; j <= m ; j ++)
{
if(judge(i ,j))
{
if(i - 1 >= 0)
dp[i][j] += dp[i-1][j] ;
if(j - 1 >= 0)
dp[i][j] += dp[i][j-1] ;
}
else
{
dp[i][j] = 0 ;
}
}
}
printf("%I64d\n" , dp[n][m]) ;
}
return 0 ;
}