当前位置: 代码迷 >> 综合 >> 1314:【例3.6】过河卒(Noip2002)
  详细解决方案

1314:【例3.6】过河卒(Noip2002)

热度:9   发布时间:2024-02-12 05:58:20.0

题目描述:

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。带我去看题目

输入:

给出n、m和C点的坐标。

输出:

从A点能够到达B点的路径的条数。

输入样例:

8 6 0 4

输出样例:

1617

通过代码:

#include <bits/stdc++.h>
#define ll long long int
#define range(_iter,_start,_end) for(long long _iter = _start;_iter <= _end;_iter ++)
using namespace std;
struct axis{ll x,y;void init(){scanf("%lld%lld",&x,&y);}
}B,C;
ll a[50][50],avl[50][50];
const ll dx[] = {-1,-2,-2,-1,1,2,2,1};
const ll dy[] = {-2,-1,1,2,2,1,-1,-2};
int main(){B.init();C.init();avl[C.x][C.y] = 1;range(i,0,7)if(C.x + dx[i] >= 0 && C.y + dy[i] >= 0)avl[C.x + dx[i]][C.y + dy[i]] = 1;range(i,0,B.x)range(j,0,B.y)if(!avl[i][j]){if(i == 0 && j == 0)a[i][j] = 1;else if(i == 0)a[i][j] = a[i][j - 1];else if(j == 0)a[i][j] = a[i - 1][j];elsea[i][j] = a[i - 1][j] + a[i][j - 1];}printf("%lld",a[B.x][B.y]);return 0;
}