1162: 【NOIP02普及组】过河卒
时间限制: 1 Sec 内存限制: 16 MB
提交: 716 解决: 247
[提交][状态][讨论版]题目描述
A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例 如下图 C 点可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

输入
B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}
输出
样例输入
6 6 3 2
样例输出
17

code
#include<iostream>
#include<algorithm>
using namespace std;
const int N(25);
const int dx[]={2,1,-1,-2,-2,-1, 1, 2};
const int dy[]={1,2, 2, 1,-1,-2,-2,-1};
int n,m,x,y,ans(0);
bool controled[N][N]={0};
long long f[N][N]={0};
void solve()
{
int i,j,k;
if (f[0][0]) { cout<<0<<endl; return ;}
f[0][0]=1;
for (k=1;k<=n+m;k++)
for (i=0;i<=n;i++)
{
j=k-i;
if (j<0||j>m) continue;
if (controled[i][j]) continue;
f[i][j]=f[i-1][j]+f[i][j-1];
}
cout<<f[n][m]<<endl;
}
int main()
{
int x0,y0;
cin>>n>>m>>x>>y;
for (int i=0;i<8;i++)
{
x0=x+dx[i];
y0=y+dy[i];
if (x0<0||x0>n||y0<0||y0>m) continue;
controled[x0][y0]=true;
}
controled[x][y]=true;
solve();
//cin.get();cin.get();
return 0;
}
posted on 2012-08-17 11:38
龙在江湖 阅读(954)
评论(0) 编辑 收藏 引用 所属分类:
动态规划 、
竞赛题解_NOIP