过河卒

来源:互联网 发布:移动有4g十加网络吗 编辑:程序博客网 时间:2024/05/07 07:01

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: csuchenanPROG:  过河卒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 ;}


原创粉丝点击