ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

普及- 过河卒

2022-05-31 23:35:58  阅读:155  来源: 互联网

标签:普及 过河 Scanner int 题解 Horse long DP


题目:P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

参考题解:题解 P1002 【过河卒】 - Chiaro 的博客 - 洛谷博客 (luogu.org)

 

 

本人参考题解查看的代码

 

import java.util.Scanner;

public class Main {
    static int t = 0;

    /*
     * 1. a Horse of Map
     * 
     * 2. go and no Horse(DFS!!!!!!!)
     * 
     * in matrix not overstep:
     * 
     * 1. add a if
     * 
     * Or
     * 
     * 2. extend the Array(Matrix)
     * 
     * Look pro
     * 
     * (1, 1) -> (x, y) has x + y paths ?
     * 
     * f(x, y) = f(x - 1, y) + f(x, y - 1)
     * 
     * if x , y == 1, 2 the (x + y) == paths Only!
     * 
     * if x == 2, y == 2, x + y == 4 But the paths are 6!
     * 
     * so x == 2, y == 2 -> f(1, 2) + f(2, 1)
     * 
     * To do:
     * 
     * 1. For
     * 
     * 2. Recursion
     * 
     * f(x, y) = f(x - 1, y) + f(x, y - 1)
     * 
     * in: 8 6 0 4
     * 
     * out: 1617
     * 
     * Error:
     * 
     * 1. Horse's foot * 2
     * 
     * 2. the size of Map
     * 
     * 3.get the path
     * 
     * 4.the long number
     * 
     * 2022_05_31-22-20-12-Week2
     * 
     * Finally AC All
     * 
     * 1. Input
     * 
     * 2. Set 2 Arrays (a foot, a Path)
     * 
     * 3. set Horse's footpoint
     * 
     * 4. Goto and add the Paths (DP, DP, DP, it is a DP!)
     */

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), m = in.nextInt(), x = in.nextInt(), y = in.nextInt();
        int fx[] = { 0, -2, -1, 1, 2, 2, 1, -1, -2 };
        int fy[] = { 0, 1, 2, 2, 1, -1, -2, -2, -1 };
        long a[][] = new long[40][40]; // B
        long b[][] = new long[40][40]; // Path
        a[x + 2][y + 2] = 1; // Horse
        for (int i = 1; i <= 8; i++) { // Foot
            a[x + 2 + fx[i]][y + 2 + fy[i]] = 1;
        }
        b[2][1] = 1;
        for (int i = 2; i <= n + 2; i++) {
            for (int j = 2; j <= m + 2; j++) {
                if (a[i][j] == 1)
                    continue;
                b[i][j] = b[i - 1][j] + b[i][j - 1];
            }
        }
        System.out.println(b[n + 2][m + 2]);

        // Map
//        for (int i = 2; i <= n + 2; i++) {
//            for (int j = 2; j <= m + 2; j++) {
//                System.out.print(a[i][j] + ", ");
//            }
//            System.out.println();
//        }

        in.close();
    }

}

 

个人理解

1. 输入(Scanner类)

 

2. 创建数组-都是矩阵(大小在范围之外)

  一个是保存了马的足迹

  另一个是保存了到(x, y)路径的数量

 

3. 设置马的足迹,有八个,为了防止数组下标溢出,B坐标+2

 

4. 用状态转移方程来统计路径的数量

f(x, y) = f(x - 1, y ) + f(x, y - 1)

 

同时还要注意不要经过马的足迹

 

Debug:

 

最好要输出Map, 及时修改代码,

 

总结:DP思想:大化小, 问题的分解

 

注意数组的范围,不要越界

 

别自作聪明把设置马的足迹用几行for循环就写出来, 还他妈搞什么位运算,结果他妈就换了一个例子就废了,草

 

还是用数组存储足迹吧,再把数组遍历一下

 

最后注意以下结果的大小,应该用long

 

参考的题解里还没完

 

还有更优解, 什么切比雪夫距离, 曼哈顿距离

 

脑容量装不下了,淦

 

还是多做题目吧,总结经验了,会自己做了,就看看进阶的题解

 

也就是先一题一解, 再多题一解, 最后是一题多解吧

 

标签:普及,过河,Scanner,int,题解,Horse,long,DP
来源: https://www.cnblogs.com/SaberZHT/p/16332736.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有