题目描述

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

棋盘用坐标表示,AA点(0, 0)(0,0)、BB点(n, m)(n,m)(nn, mm为不超过2020的整数),同样马的位置坐标是需要给出的。

现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入输出格式

输入格式:

一行四个数据,分别表示BB点坐标和马的坐标。

输出格式:

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

【题目提示了结果可能很大,疯狂暗示long long】

一开始想就20*20的格子,非常快的写了bfs,愉快地TLE。再次明白男人的直觉不可信,递推了一下式子。

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

很明眼的关系,就不费话了。

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std; bool box[][];
void into(int a, int b)
{
for (int j = ; j <= ; j ++)
{
for (int k = ; k <= ; k ++)
{
box[j][k]= false;
}
}
box[a][b]= true;
if (a- >= )
{
if (b- >= )
{
box[a- ][b- ]= true;
}
if (b+ <= )
{
box[a- ][b+ ]= true;
}
}
if (a+ <= )
{
if (b- >= )
{
box[a+ ][b- ]= true;
}
if (b+ <= )
{
box[a+ ][b+ ]= true;
}
}
if (b- >= )
{
if (a- >= )
{
box[a- ][b- ]= true;
}
if (a+ <= )
{
box[a+ ][b- ]= true;
}
}
if (b+ <= )
{
if (a- >= )
{
box[a- ][b+ ]= true;
}
if (a+ <= )
{
box[a+ ][b+ ]= true;
}
}
}
long long f[][];
int main()
{
int x, y, a, b;
while (cin >> x >> y >> a >> b)
{
into(a, b);
for (int j = ; j <= x; j ++)
{
for (int k = ; k <= y; k ++)
{
f[j][k]= ;
}
}
f[][]= ;
for (int j = ; j <= x; j ++)
{
for (int k = ; k <= y; k ++)
{
if (! box[j][k])
{
f[j+ ][k]+= f[j][k];
f[j][k+ ]+= f[j][k];
}
}
}
// for (int j = 0; j <= x; j ++)
// {
// for (int k = 0; k <= y; k ++)
// {
// printf("%4d", box[j][k]);
// }
// printf("\n");
// }
// printf("###############################\n");
// for (int j = 0; j <= x; j ++)
// {
// for (int k = 0; k <= y; k ++)
// {
// printf("%4d", f[j][k]);
// }
// printf("\n");
// }
cout << f[x][y] << endl;
}
return ;
}

bfs既然写了也丢着吧。

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std; bool box[][];
void into(int a, int b)
{
box[a][b]= true;
if (a- >= )
{
if (b- >= )
{
box[a- ][b- ]= true;
}
if (b+ <= )
{
box[a- ][b+ ]= true;
}
}
if (a+ <= )
{
if (b- >= )
{
box[a+ ][b- ]= true;
}
if (b+ <= )
{
box[a+ ][b+ ]= true;
}
}
if (b- >= )
{
if (a- >= )
{
box[a- ][b- ]= true;
}
if (a+ <= )
{
box[a+ ][b- ]= true;
}
}
if (b+ <= )
{
if (a- >= )
{
box[a- ][b+ ]= true;
}
if (a+ <= )
{
box[a+ ][b+ ]= true;
}
}
}
bool Is_out_box (pair<int, int> p, int x, int y)
{
if (p.first < || p.first > x ) return true;
if (p.second < || p.second > y ) return true;
return false;
}
queue<pair<int, int> >q;
int main()
{
int x, y, a, b;
while (cin >> x >> y >> a >> b)
{
for (int j = ; j <= ; j ++)
{
for (int k = ; k <= ; k ++)
{
box[j][k]= false;
}
}
into(a, b);
int cnt = ;
while (! q.empty()) q.pop();
pair<int, int> p1 (, );
pair<int, int> p2, p3;
q.push(p1);
while (! q.empty())
{
p2= q.front();
q.pop();
// printf("%d -- %d\n", p2.first, p2.second);
while (p2.first == x&& p2.second== y)
{
cnt ++;
if (! q.empty() )p2= q.front(), q.pop();
else break;
}
for (int c = ; c < ; c ++)
{
if (! c) p3.first= p2.first+ , p3.second= p2.second;
else p3.first= p2.first, p3.second= p2.second+ ;
if (! box[p3.first][p3.second]&& ! Is_out_box(p3, x, y) ) q.push(p3);
}
}
cout << cnt << endl;
}
return ;
}

bfs

P1002 过河卒 【递推、简单动规】的更多相关文章

  1. bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望

    [bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...

  2. 【bzoj1042】[HAOI2008]硬币购物-递推与动规-容斥原理

    硬币购物 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一行 c1,c2 ...

  3. 洛谷 P1002过河卒

    洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...

  4. 洛谷P1002 过河卒 [2017年4月计划 动态规划15]

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

  5. P1002 过河卒【dp】

    P1002 过河卒 题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制 ...

  6. 洛谷P1002 过河卒【dp】

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

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

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

  8. 洛谷P1002 过河卒

    关于蒟蒻的我,刚刚接触DP....   那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...

  9. 洛谷[P1002]过河卒

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

随机推荐

  1. 解决华为手机不出现logcat日志的问题

    问题描写叙述:公司一部华为手机在连接Eclipse时在Logcat中看不到相关日志 解决方法:1 进入手机拨号界面2 输入*#*#2846579#*#*3 输入完成后自己主动跳转到測试界面4 依次选择 ...

  2. webrtc 视频 demo

    webrtc 视频 demo webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B A webrtc.html作为offer <!DOCTYPE ...

  3. leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  4. AutoLayout初战----Masonry与FDTemplateLayoutCell实践

    学iOS也有几个月了.一直都是纯代码开发,菜鸟入门,到今天还处在Frame时代.刚好近期项目在提审.有点时间能够学学传说中的AutoLayout.事实上.就是android的相对布局(Relative ...

  5. 处理new分配内存失败情况

    转自:http://www.51testing.com/html/70/n-827070.html 在C++语言中,我们经常会使用new给一个对象分配内存空间,而当内存不够会出现内存不足的情况.C++ ...

  6. JPA学习笔记(13)——查询缓存

    使用hibernate的查询缓存 运行下面代码: String jpql = "FROM User u WHERE u.id = ?"; Query query = entityM ...

  7. Tyvj 1068 巧用扩展KMP

    Tyvj1068 给定两个长度为2*10^5的字符串为A和B 求B在A中匹配后,任意匹配长度的位置个数. KMP算法大家应该烂熟于心才好,这样碰到这样的题才能灵活运用.有时做题真的需要一点灵感.首先, ...

  8. JSP-Runoob:JSP 页面重定向

    ylbtech-JSP-Runoob:JSP 页面重定向 1.返回顶部 1. JSP 页面重定向 当需要将文档移动到一个新的位置时,就需要使用JSP重定向了. 最简单的重定向方式就是使用respons ...

  9. Secure CRT中解决vim高亮设置的方法

    此文主要是解决vim编程中高亮显示的.原因是: 1.默认情况下,SecureCRT是有自己的终端显示颜色.这样在我们编程中不利于阅读内容. 2.我们必须到Linux系统中进行改进才能真正解决这样的问题 ...

  10. J20170618-hm

    番兵(ばんぺい) 哨兵 後始末 善后