codevs1219 骑士遍历(棋盘DP)

来源:互联网 发布:360数据恢复大师免费吗 编辑:程序博客网 时间:2024/04/24 04:34

题目描述 Description

设有一个n*m的棋盘(2≤n≤50,2m≤50),如下图,在棋盘上有一个中国象棋马。

规定:

1)马只能走日字

2)马只能向右跳

问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数。

输入描述 Input Description

第一行2个整数n和m

第二行4个整数x1,y1,x2,y2

输出描述 Output Description

输出方案数

样例输入 Sample Input

30 30

1 15 3 15

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

2<=n,m<=50


水题,直接推就行了。。。


#include<iostream>#include<cassert>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<string>#include<iterator>#include<cstdlib>#include<vector>#include<stack>#include<map>#include<set>using namespace std;#define rep(i,f,t) for(int i = (f),_end_=(t); i <= _end_; ++i)#define rep2(i,f,t) for(int i = (f),_end_=(t); i < _end_; ++i)#define dep(i,f,t) for(int i = (f),_end_=(t); i >= _end_; --i)#define dep2(i,f,t) for(int i = (f),_end_=(t); i > _end_; --i)#define clr(c, x) memset(c, x, sizeof(c) )typedef long long int64;const int INF = 0x5f5f5f5f;const double eps = 1e-8;//*****************************************************int64 d[55][55];int main(){    int n,m,x1,x2,y1,y2;    scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);    if(x2 <= x1){        cout<<0<<endl;        return 0;    }    clr(d,0);    d[x1][y1] = 1;    for(int i = x1; i < x2; ++i)    {        for(int j = 1; j <= m; ++j)        {            if(d[i][j])            {                d[i+1][j+2] += d[i][j];                d[i+2][j+1] += d[i][j];                if(j-2 > 0) d[i+1][j-2] += d[i][j];                if(j-1 > 0) d[i+2][j-1] += d[i][j];            }        }    }    cout<<d[x2][y2]<<endl;    return 0;}





0 0
原创粉丝点击