题目描述

棋盘上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. leetCode 60.Permutation Sequence (排列序列) 解题思路和方法

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  2. 20170623_oracle备份和恢复_常见问题

    1 为什么需要备份?备份分类? 1)故障.迁移.误操作 2)备份分类: 物理与逻辑角度:物理备份.逻辑备份 备份策略角度:完全备份.增量备份.差异备份 2 使用导入导出进行备份和恢复及其四种模式:其他 ...

  3. Xshell配色方案啊【学习笔记】

    自己移植从putty版本移植到Xshell的配色方案,效果不错,看上去挺舒服. [myisayme] text(bold)=eaeaea magenta(bold)=ff55ff text=fffff ...

  4. hdoj--5611--Baby Ming and phone number(模拟水题)

     Baby Ming and phone number Crawling in process... Crawling failed Time Limit:1500MS     Memory Li ...

  5. [模板] BSGS

    BSGS是一种解决一类专门的问题的解法,主要是解决已知A, B, C,求X使得A^x = B (mod p)这一类问题. 解法很简单,先设x = i*m-j(m=ceil(sqrt(p))),然后进行 ...

  6. C++11系列-什么是C++11

    什么是C++0x? C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性.在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编 ...

  7. E20170926-mk

    validation   n. 确认; proposal n. 建议; 提议; 求婚; 〈美〉投标; teaser   n. 戏弄者,喜欢戏弄别人的人; 棘手的问题; batch   n. 一批; 一 ...

  8. P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of  pipes to transport mil ...

  9. [Swift通天遁地]八、媒体与动画-(8)使用开源类库快速实现位移动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. url参数为数组

    //url中state参数为数组 ?baseline_id=12&version_id=34&state[]=complete&state[]=hangup&state ...