ACM 78. [NOIP2002] 过河卒(dp)
2014-09-08 12:45
393 查看
78. [NOIP2002] 过河卒
★ 输入文件:pj024.in输出文件:
pj024.out简单对比
时间限制:1 s 内存限制:128 MB
问题描述
如图,A点有一过河卒,需要走到目标B点。卒行走的规则:可以向下,或者向右。
同时在棋盘上的任一点有一个对方的马(如图中C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
例如上图C点的马可控制9个点(P1...P8,C)。卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0),B点(n,m)(n,m为不超过20的整数,并有键盘输入),同样,马的位置坐标是需要给出的(约定:C≠A同时C≠B)。
现在要你计算出 卒从A点出发能够到达B点的路径的条数。
【输入格式】
输入
一行四个整数n,m,x,y
B点坐标(n,m)以及对马的坐标(x,y){不用判错}
【输出格式】
输出
一个整数(路径的条数)
【输入样例】
输入文件
6 6 3 2
输出文件
17
#include <iostream> #include <cstdio> using namespace std; #define MAX_N 21 int n,m,x,y; int dp[MAX_N][MAX_N]; int dx[]={2,1,2,-1,-2,1,-1,-2}; int dy[]={1,2,-1,2,1,-2,-2,-1}; bool no[MAX_N][MAX_N]; int main() { freopen("pj024.in","r",stdin); freopen("pj024.out","w",stdout); cin>>n>>m>>y>>x; for(int i=0;i<8;i++) { int nx=x+dx[i],ny=y+dy[i]; if(nx>=0 && nx<=m && ny>=0 && ny<=n) { no[ny][nx]=true; } } no[y][x]=true; for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { if(no[i][j]) continue; int cnt=0; if(i>=1 && !no[i-1][j]) cnt+=dp[i-1][j]; if(j>=1 && !no[i][j-1]) cnt+=dp[i][j-1]; dp[i][j]=cnt; if(i==0 && j==0) dp[0][0]=1; } } cout<<dp [m]<<endl; return 0; }
相关文章推荐
- NOIP2002-过河卒—经典的dp思想
- 过河卒(NOIP2002)
- 马拦过河卒(NOIP2002)
- noip2002 过河卒 (动态规划求路径总数)
- noip2002 普及组 过河卒
- ACM 简单DP NOIP2010提高组 乌龟棋
- ACM 87. [NOIP2000] 乘积最大(水dp)
- 【DP 训练】Folding, ACM/ICPC NEERC 2002, UVa1630
- acmore|acmore.cc1083级数求和1084选数1086过河卒(NOIP2002)
- ACM 94. [NOIP2001] 统计单词个数(划分dp)
- ACM 背包DP [NOIP2006]金明的预算方案(budget)
- ACM 98. [NOIP2002] 均分纸牌(贪心)
- ACM 519. [NOIP2010] 乌龟棋(dp)
- ACM 106. [NOIP2003] 加分二叉树(区间dp)
- ACM 588. [NOIP1999] 拦截导弹(dp+最长不上升子序列)
- NOIP 2002普及组 过河卒详解
- ACM 116. [NOIP2006] 能量项链(dp矩阵连乘改版+数据2倍化+枚举)
- NOIP2002-过河卒题解
- 【9307】&【a303】过河卒(NOIP2002)
- 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) H Heroes Of Might And Magic (隐含dp)