首页 > 其他分享 >P1002 [NOIP2002 普及组] 过河卒

P1002 [NOIP2002 普及组] 过河卒

时间:2024-04-08 10:34:40浏览次数:28  
标签:过河 NOIP2002 destination P1002 back second emplace hourse first

题意:卒子过河,有个马,问安全到达终点的路径有多少条。起点在0,0。每一步可以往右或者往下。

思路:处理出马的看守点,然后暴力。。看了一下暴力会TLE。400^2. 直接dp转移即可。

总结:不知道这个还要开long long, 哎。!

void solve(){
    pair<int, int> destination;
    vector<pair<int, int>> hourse(1);
    cin >>destination.first >> destination.second;
    cin >> hourse[0].first >> hourse[0].second;

    hourse.emplace_back(hourse[0].first - 1, hourse[0].second - 2);
    hourse.emplace_back(hourse[0].first - 1, hourse[0].second + 2);
    hourse.emplace_back(hourse[0].first + 1, hourse[0].second - 2);
    hourse.emplace_back(hourse[0].first + 1, hourse[0].second + 2);

    hourse.emplace_back(hourse[0].first + 2, hourse[0].second - 1);
    hourse.emplace_back(hourse[0].first - 2, hourse[0].second - 1);
    hourse.emplace_back(hourse[0].first + 2, hourse[0].second + 1);
    hourse.emplace_back(hourse[0].first - 2, hourse[0].second + 1);

    sort(hourse.begin(), hourse.end());
    for (const auto& x : hourse){
        if (x == destination){
            cout << 0 << '\n';
            return;
        }
    }

    vector<vector<long long>>dp(22, vector<long long>(22, 0));
    auto inHourse = [&](int x, int y){
      for (const auto& cur : hourse){
        if (cur == pair<int, int>{x, y}){
            return true;
        }
      }
      return false;
    };

    dp[0][0] = 1;
    for (int i = 0; i <= 20; ++i){
        for (int j = 0; j <= 20; ++j){
            if (inHourse(i, j) == false ){
                if (inHourse(i + 1, j) == false) dp[i + 1][j] += dp[i][j];
                if (inHourse(i, j + 1) == false) dp[i][j + 1] += dp[i][j];
            }
        }
    }

    cout << dp[destination.first][destination.second] << '\n';
}

标签:过河,NOIP2002,destination,P1002,back,second,emplace,hourse,first
From: https://www.cnblogs.com/yxcblogs/p/18120582

相关文章

  • P1002 [NOIP2002 普及组] 过河卒
    题目链接:从起点走到终点,最后一步一定是向右或向下走过来的,因此就可以列出状态转移方程。值得注意的是,对于横着和竖着的两条边界不可直接想当然地认为路径数一定等于\(1\),因为在中途可能会有控制点的存在,因此还是要老老实实地列出状态转移方程。由于边界时只会从一个方向递推过来......
  • 洛谷p1002题解
    [NOIP2002普及组]过河卒题目描述棋盘上AAA点有一个过河卒,需要走到目标BB......
  • 洛谷p1002(过河卒)
    题目描述 如图,A点有一个过河卒,需要走到目标B点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如下图C点上的马可以控制9个点(图中的P1,P2…P8和C)。卒不能通过对方马的控......
  • P1002 [NOIP2002 普及组] 过河卒
    emmmm...据说是比较简单的dp?(再一次意识到自己的菜)链接:https://www.luogu.com.cn/problem/P1002题目:总的思路就是一个状态转移方程吧:dp[x][y]=dp[x-1][y]+dp[x][y-1];然后如果发现这个点不能通过,那么强制修改dp[x][y]=0;代码:#include<iostream>#include<vector>#inc......
  • 【洛谷P1036】 [NOIP2002 普及组] 选数
    一、题目:二、解题思路:本文章采用的解决方法是递归与DFS(深度优先搜索)。以下图是思路图:1.首先-确定位置题目说4个数字取三个数,所以考虑的只有三个位置和这三个位置分别放什么数值。从第一个位置开始放数。2.其次-开始放数分为4种可能,第一位置可以先放3,那么第二个位置......
  • 【华为OD机试真题】A卷-士兵过河(Python)
    一、题目描述【华为OD机试真题】A卷-士兵过河(Python)题目描述:一支N个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河。敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭。现在军队只找到了1只小船,这船最多能同时坐上2个士兵。1)当1个士兵划船过河,用时为a[i];0<=i<......
  • P1037 [NOIP2002 普及组] 产生数 python 题解
    原题链接:产生数原理解释本题就是基本的dfs,对每一个数遍历深搜,得到他能变化的所有情况,最后相乘就是结果,网上都是c的解法,需要用到高精度,但是python可以处理大数,不需要。vis[]判断该数是否变换过,防止重复以n=123,k=2,变换列表x=[1,3],y=[3,4],即1->3,3->4:先遍历1:遍历......
  • 每日一题 第三十五期 洛谷 过河卒
    [NOIP2002普及组]过河卒题目描述棋盘上AAA点有一个过河卒,需要走到目标BB......
  • P1036 [NOIP2002 普及组] 选数
    思路:也算典型的dfs,题目就是要求从n个数中选择k个数,计算这k个数的和,看这个和是否是素数。我们知道在dfs时相当于是进行全排列,而结果要求的是组合后和的情况。根据排列和组合的关系,他们之间差K!倍,所以需要在dfs求得个数cnt后除以k!。题目:AC代码:#include<algorithm>#include<io......
  • 青蛙过河(前缀+二分)
    1importjava.util.*;23publicclassMain{4publicstaticvoidmain(String[]args){5Scannerscanner=newScanner(System.in);6intn=scanner.nextInt();7longx=scanner.nextLong();8//前缀和9lo......