题目描述

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入

一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)

输出

一个数据,表示所有的路径条数。

样例输入
6 6 3 3
样例输出
6
 
咋看之下,似乎就是一道搜索题,于是直接写了一个DFS。果断时间超限。代码如下:
//马栏过河卒——时间超限
using namespace std;
int MAP[20][20];
int n, m, mx, my, cnt;
int dx[] = {1,0}, dy[] = {0,1};
int a[8]={-2,-2,-1,-1,1,1,2,2};//马控制的方向
int b[8]={1,-1,2,-2,2,-2,1,-1}; void DFS(int x, int y)
{
if(MAP[x][y] || x<0 || x>n || y<0 || y>m) return ;//边界
if( x == n && y == m )
{
cnt ++ ;
return ;
}
MAP[x][y] = 1 ;
for(int i=0; i<2; i++)
DFS(x+dx[i],y+dy[i]);
MAP[x][y] = 0 ;
} int main()
{
cin >> n >> m >> mx >> my ;
memset(MAP,0,sizeof(MAP));
MAP[mx][my] = 1 ;
for(int i=0; i<8; i++)
MAP[mx+a[i]][my+b[i]] = 1 ;
cnt = 0 ;
DFS(0,0);
cout << cnt << endl ; return 0;
}

后来,仔细想了会,就用递推给AC了!O(∩_∩)O哈哈~

#include <bits/stdc++.h>

using namespace std;
int MAP[20][20];
long long cot[20][20];
int n, m, mx, my;
int a[8]= {-2,-2,-1,-1,1,1,2,2}; //马控制的方向
int b[8]= {1,-1,2,-2,2,-2,1,-1}; int main()
{
while(cin >> n >> m >> mx >> my )
{
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
{
MAP[i][j]=1;//给数组初始化,赋为1,表可走
cot[i][j]=0;//计数
} MAP[mx][my] = 0 ;//马控制的点
for(int i=0; i<8; i++)
{
int x = mx + a[i] ;
int y = my + b[i] ;
if( x >=0 && x<20 && y>=0 && y<20)
MAP[x][y] = 0 ;
}
bool flag = true ;
for(int i=0; i<20; i++)
{
if( flag )
{
if(MAP[0][i]==0) flag = false ;
else cot[0][i] = 1 ;
}
}
flag = true ;
for(int i=0; i<20; i++)
{
if( flag )
{
if(MAP[i][0]==0) flag = false ;
else cot[i][0] = 1 ;
}
} for(int i=1; i<20; i++)
for(int j=1; j<20; j++)
if(MAP[i][j])
cot[i][j] = cot[i-1][j]*MAP[i-1][j]+cot[i][j-1]*MAP[i][j-1]; cout << cot[n][m] << endl ;
} return 0;
}

ACM题目————马拦过河卒的更多相关文章

  1. NOIP 马拦过河卒

    描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘 ...

  2. ACM 马拦过河卒(动态规划)

    解题思路: 用一个二维数组a[i][j]标记 马的位置和马的跳点(统称控制点)该位置=1: 再用一个二维数组f[i][j]表示行进的位置,如果前一行的当前列不是马的控制点,或者前一列的当前行不是马的控 ...

  3. 【动态规划】Vijos P1121 马拦过河卒

    题目链接: https://vijos.org/p/1616 题目大意: 卒从(0,0)走到(n,m),只能向下或向右,不能被马一步碰到或走到马,有几种走法. 题目思路: [动态规划] 把马控制的地方 ...

  4. Vijos 1121 马拦过河卒

    首先要看清题目,卒只能向右或者向下走.而不是四周转.这样的话就无解了. 定义f[i][j],表示走到(i,j)这个点时的总步数.这样就写出了一个递推公式f[i][j]=f[i-1]+f[i][j-1] ...

  5. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  6. SDUT 1265-马停下过河卒(DFS)

    马拦过河卒 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit3000ms Memory Limit 65536K ...

  7. P1002 过河卒

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  8. 洛谷 P1002 过河卒 【棋盘dp】

    题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  9. 洛谷[P1002]过河卒

    原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

随机推荐

  1. MySQL复制-设置延迟复制

    mysql> stop slave ; Query OK, 0 rows affected (0.00 sec) mysql> change master to master_delay= ...

  2. UILabel详解

    // ----------------------UILabel--------------------------- UILabel *label = [[UILabel alloc] initWi ...

  3. Java基础之写文件——缓冲区中的多条记录(PrimesToFile3)

    控制台程序,上一条博文(PrimesToFile2)每次将一个素数写入到文件中,所以效率不是很高.最好是使用更大的缓冲区并加载多个素数. 本例重复使用三个不同的视图缓冲区加载字节缓冲区并尽可能加入更多 ...

  4. Swift动画编程指南-02 Swift动画是怎么炼成的

    上一节我们看了几个很棒的例子,我们不禁会想.他们是怎么设计的,怎么从一个空白的画布变成一个完整的,美丽的动画.这些动画是如何产生的,是哪些属性被改变了.我们还要认真思考的是,每一个步骤到底发生了什么. ...

  5. 20145207 《Java程序设计》第10周学习总结

    前言:   最后一篇java博客好激动啊..不过猜猜我在干什么?没错,安虚拟机,唉!紧接着又是一大波信安系统的博客,真开心~好啦边敲博客,边装虚拟机. 教材知识汇总 13.1 网络概述 13.1.1计 ...

  6. SOL面向对象 五大原则

    单一职责原则SRP(Single Responsibility Principle)是指一个类的功能要单一,不能包罗万象.如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起 ...

  7. C++之路进阶——codevs1204(寻找子串位置)

    1204 寻找子串位置  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze     题目描述 Description 给出字符串a和字符串b,保证b是a的一个子 ...

  8. c++必读

    下面的是学c++时要注意的.绝对经典.!!  1.把c++当成一门新的语言学习(和c没啥关系!真的.): 2.看<thinking in c++>,不要看<c++变成死相>:  ...

  9. <c:if>标签的使用

    <c:if>标签用来在页面中实现条件化的判断功能.它的主要目的就是替换Java脚本中的if语句,来实现页面内容的条件化输出功能.这个标签所进行的判读主要是依据表达式来进行的,如果该表达式的 ...

  10. 变形--旋转 rotate()

    旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时针旋转:如果这个值为负值,元素相 ...