2002普及组第四题过河卒

题目描述

如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。

棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

输入

键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y){不用盘错}

输出

屏幕输出
一个整数(路径的条数),答案保证<=2^63-1。

样例输入

6 6 3 2

样例输出

17

提示

来源

NOIP2002,递推算法

解题思路:

首先是看到这道题因为只能向下或向右,就想到递推,然后就是第一要将马覆盖的地方清为零,第二个是最好不要从0,0到n,m,而是从1,1到n+1,m+1;这样就不会出现负数比较好处理,但是要注意判断他是否被马覆盖时要-1保持一致。

代码

#include<iostream>
#include<cstdio>
int map[25][25],n,m,x,y;
long long dp[25][25];
using namespace std;
int main(){
  scanf("%d%d%d%d",&n,&m,&x,&y);
  map[x][y]=map[x-1][y-2]=map[x-2][y-1]=1;
  map[x-2][y+1]=map[x-1][y+2]=map[x+1][y-2]=1;
  map[x+2][y-1]=map[x+2][y+1]=map[x+1][y+2]=1;
  dp[1][0]=1;
  n++;m++;
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
      dp[i][j]=dp[i-1][j]+dp[i][j-1];
      if(map[i-1][j-1])dp[i][j]=0;
  }
  printf("%lld",dp[n][m]);
return 0;
}

时间: 2024-10-24 13:26:39

2002普及组第四题过河卒的相关文章

守望者的逃离(2007年普及组第3题)| 贪心算法

守望者的逃离(2007年普及组第3题) [问题描述] 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率深藏在海底的那加企图叛变,守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时岛上的所有人都会遇难:守望者的跑步速度为17m/s, 以这样的速度是无法逃离荒岛的.庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点.守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复.

【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解

卡特兰数,这是一向掌握不大熟练的内容,今天借NOIP2003普及组的第三题来总结一下.当然由于原题数据弱抱,不需要高精.如果有时间我会不断补充这篇文章里的内容. 二话不说上代码 //Catalan #include<iostream> using namespace std; long long n,f[20]={0}; /*NO.1 f[n+1]=f[i]*f[n-i]from 0 to n plus f[0]=1 int main(){ cin>>n; f[0]=1;f[1]=

[JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第四题:二阶魔方]

[题目取自CSDN-671coder] 第四题:二阶魔方 题目描述: 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示) 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向:白 z轴反向:黄 假设我们规定,只能对该魔方进行3种操作.分别标记为: x 表示在x轴正向做顺时针旋转 y 表示在y轴正向做顺时针旋转 z 表示在z轴正向做顺时针旋转 基本旋转后的效果如图2,3,4所示. xyz 则表示顺序执行x,

普及C组第四题(8.18)

1574. [提高]X-因子链 (File IO): input:factor.in output:factor.out 时间限制: 1000 ms  空间限制: 131072 KB 题目描述 给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0=1,X1,X2,...,Xm=X满足:Xi<Xi+1同时Xi|Xi+1(Xi+1能被Xi整除) 要求X-因子链的最大长度Len和长度为Len的X-因子链的数量. 输入 一个正整数X(X <231) 输出 一行,两个整数,分别表示最大长度和该

【基础练习】【字符串处理】noip2011普及组第2题 统计单词数题解

这又是一道成功加入"容易吗"系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置:改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格--幸亏其他单词前没有,否则还真不知道怎么办:实现的时候又出了各种问题.于是我决定总结一下. 题目: 给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大

Noip2012 普及组 第三题 摆花

博主声明: 新手第一次写动规的题解,如果出现错误请各位大力的喷,但不要骂脏话,最好告诉我怎么改,谢谢~.~ !!! 摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆. 通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号. 为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆, 摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列. 试编程计算,一共有多少种不同的摆花方案

【递归】Vijos P1132 求二叉树的先序序列(NOIP2001普及组第三题)

题目链接: https://vijos.org/p/1132 题目大意: 给定二叉树的中序和后序遍历,求该二叉树先序遍历. 题目思路: [递归] 这题妥妥递归. 二叉树先序根左右,中序左根右,后序左右根. 对于每一颗子树,它的后序最后一个必定是根,于是可以根据根在中序的位置把左子树和右子树区分开来. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include<string>

摆花(2012Noip普及组第3题)

摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定第 i 种花不能超过 ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列. 试编程计算,一共有多少种不同的摆花方案. [输入] 输入文件 flower.in,共 2 行. 第一行包含两个正整数 n 和 m,中间用一个空格隔开. 第二行有

C++ P1188 火星人(NOIP2004普及组第3题)

#include<iostream>#include<cstdio>using namespace std; int N[10005],n,m,time,ap[10005],sign[10005];//ap用来表示某一元素在排列中出现的次数: bool get,out;//表示是否已经找到标准排列,是否已经输出: void DFS(int x){ if(x>n) { get=1;//找到标准排列: time++; if(time==m+1) { for(int i=1;i&l