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

P1002 [NOIP2002 普及组] 过河卒

时间:2023-02-10 18:35:53浏览次数:39  
标签:过河 NOIP2002 int P1002 bx dp

P1002 [NOIP2002 普及组] 过河卒

https://www.luogu.com.cn/problem/P1002

 

思路

初始设置 0 行 0列的点 取值为1,表示有一条路径到达此目标点,  注意当遇到第一个障碍点, 停止赋值

然后对

1-n 行

1-m列

做dp计算 按照如下公式:

dp[x][y] = dp[x][y-1] + dp[x-1][y];

Code

https://www.luogu.com.cn/record/101844552

long long dp[21][21];
int n, m;
int bx, by;

bool is_blocked(int x, int y){
    if (x==bx && y==by){
        return true;
    }
    
    int steps[8][2] = {
            {1,2},
            {2,1},
            {2,-1},
            {1, -2},
            {-1, -2},
            {-2, -1},
            {-2, 1},
            {-1, 2},
        };
        
    for(int i=0; i<8; i++){
        int nx = bx + steps[i][0];
        int ny = by + steps[i][1];
        
        if (x==nx && y==ny){
            return true;
        }
    }
    
    return false;
}

int main()
{
    memset(dp, 0, sizeof(dp));
    
    cin >> n >> m;
    cin >> bx >> by;

    dp[0][0] = 1;

    for(int y=1; y<=m; y++){
        if (is_blocked(0, y)){
            break;
        }
        
        dp[0][y] = 1;
    }

    for(int x=1; x<=n; x++){
        if (is_blocked(x, 0)){
            break;
        }

        dp[x][0] = 1;
    }

    for(int x=1; x<=n; x++){
        for(int y=1; y<=m; y++){
//            cout << "x=" << x << "y=" << y <<endl;
            
            if (is_blocked(x, y)){
                continue;
            }
            
//            cout << "set" << endl;
            
            dp[x][y] = dp[x][y-1] + dp[x-1][y];
            
//            cout << "dp[x][y]=" << dp[x][y] << endl;
        }
    }

    cout << dp[n][m] << endl;

    return 0;
}

 

标签:过河,NOIP2002,int,P1002,bx,dp
From: https://www.cnblogs.com/lightsong/p/17110003.html

相关文章

  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    P1002[NOIP2002普及组]过河卒#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){intHorse_y[8]={2,1,-1,-2,-2,-1,1,2};......
  • 青蛙过河
    小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。河里的石头排成了一条直线,小青蛙每次跳跃必须落在一块石头或者岸上。不过,每......
  • 算法--旅行者过河问题
    1.题目在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够......
  • P1036 [NOIP2002 普及组] 选数(DFS + 不降原则)
    P1036[NOIP2002普及组]选数题意​ 在n个数里选k个数,有多少中选法,使得选出来的数的和为素数。不能重复选。思路​ n很小,直接爆搜,但是如果不使用不降原则的话,就......
  • 青蛙过河算法
    Asmallfrogwantstogettotheothersideofariver.Thefrogisinitiallylocatedononebankoftheriver(position0)andwantstogettotheoppositeba......
  • 脑筋急转弯-2498. 青蛙过河 II
    2498.青蛙过河IIDescriptionDifficulty:中等RelatedTopics:给你一个下标从0 开始的整数数组 stones ,数组中的元素 严格递增 ,表示一条河中石头的位置。一只......
  • 借船过河:一个据说能看穿你的人性和欲望的心理测试
    借船过河:一个据说能看穿你的人性和欲望的心理测试一男人M要与未婚妻F相会结婚,但两人一河相隔,M必须要借船过河才能见到F,于是他开始四处找船。 这时见一个女子L刚好......
  • P8775 [蓝桥杯 2022 省 A] 青蛙过河
    简要题意有一只青蛙在\(1\)处,有一些石头,位于\(2,3,4,\cdotsn\),它们的高度是\(H_2,H_3,\cdots,H_n\)。青蛙每落一次石头,该石头的高度就会\(-1\),直至高度为\(0\),此时......
  • P1002 过河卒 详细题解 搜索回溯+递归 [NOIP2002 普及组]
    题目描述棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方......
  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    第一个dp(动态规划)题纪念一下先尝试暴力写一个递归,由于x与y只能增加,不存在回路。#include<iostream>usingnamespacestd;inta_x,a_y,h_x,h_y,sum=0;//a_x,a_y代表目标地......