codevs 1219 骑士游历 1997年

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题目描述 Description

设有一个n*m的棋盘(2≤n≤50,2≤m≤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

棋盘dp

搞法一 记忆化搜索

#include <iostream>
#include <cstdio>
int n,m,x1,y1,x2,y2;
long long dp[55][55];

long long dfs(int x,int y)
{
    if(x==x2&&y==y2) return 1;
    if(y>n||y<=0) return 0;
    if(x>x2) return 0;
    long long ans=0;
    if(dp[x][y]>0) return dp[x][y];
    ans+=dfs(x+1,y+2);
    ans+=dfs(x+2,y+1);
    ans+=dfs(x+2,y-1);
    ans+=dfs(x+1,y-2);
    dp[x][y]=ans;
    return ans;
}
int main()
{
    scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
    std::cout<<dfs(x1,y1);
    return 0;
}

157ms

搞法二 dp

#include <cstdio>
long long dp[55][55];
int n,m,x1,x2,y1,y2;
int main()
{
    scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
    dp[y1][x1]=1;
    for(int x=x1;x<=x2;x++)
    {
        for(int y=1;y<=n;y++)
        {
            if(y-1>0) dp[y][x]+=dp[y-1][x-2];
            if(y-2>0) dp[y][x]+=dp[y-2][x-1];
            if(y-n<0) dp[y][x]+=dp[y+1][x-2];
            if(y-n+1<0) dp[y][x]+=dp[y+2][x-1];
        }
    }
    printf("%d",dp[y2][x2]);
    return 0;
}

时间: 2024-12-06 19:55:21

codevs 1219 骑士游历 1997年的相关文章

codevs——T1219 骑士游历

 http://codevs.cn/problem/1219/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个

1219 骑士游历(棋盘DP)

1997年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个整数x1,y1,x2,y2 输出描述 Output Descrip

骑士游历

理论: 骑士游历问题是放在8×8的国际象棋棋盘上的一个马,按照马走"日"字的规则是否能够不重复地走遍棋盘的每个格. 解答: 每次选取下一次走法最少的走,但总是游历失败. java实现: package 经典; public class Knight { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] board=new int

骑士游历/knight tour - visual basic 解决

在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完棋盘上所有空格的路径. 思路就是选角落的一格为起点,把所有能走的路全部路径全部试一遍.要试8^63次,计算时间太长了.把棋盘调成5x5的,比较好算.另外书里提示,根据空格的可访问的难易(难易由周围可访问它的空格数来决定),先选择更难访问的空格访问. 下面是完全遍历一遍的方法. Option Expl

POJ 2488 -- A Knight&#39;s Journey(骑士游历)

POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的"骑士游历"问题 输入:第一行,整数n,接下来是n行,每一行为p和q,p为行数,q为列数,p用1...p编号,q用A...Q编号 马的走法:每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走"日"字).可以越子,没有中国象棋中的"蹩马腿&

骑士游历问题

由于最近在学习回溯法,所以跟回溯法相关的问题尽量都看下吧. 骑士游历问题的完整描述见:http://blog.csdn.net/sb___itfk/article/details/50905275 我的思路 我的实现如下,还是最简单最粗暴的解法: import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by clearbug on 2018/2/26. */ public

HihoCoder 1504 : 骑士游历 (矩阵乘法)

描述 在8x8的国际象棋棋盘上给定一只骑士(俗称“马”)棋子的位置(R, C),小Hi想知道从(R, C)开始移动N步一共有多少种不同的走法. 输入 第一行包含三个整数,N,R和C. 对于40%的数据, 1 <= N <= 1000000 对于100%的数据, 1 <= N <= 1000000000 1 <= R, C <= 8 输出 从(R, C)开始走N步有多少种不同的走法.由于答案可能非常大,你只需要输出答案模1000000007的余数. 样例输入 2 1 1

hihocoder offer收割编程练习赛13 D 骑士游历

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const ll mod = 1e9 + 7; 11 12 ll n, x, y;

【CODEVS1219】骑士游历

题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤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 样例输出