题目描述

棋盘上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. 【JAVA】两点经纬度直线距离的计算

    来自谷歌地图的计算公式: 通过JAVA的Math类各种方法调用.实现上述公式 private static double EARTH_RADIUS = 6378.137;// 单位千米 /** * 角 ...

  2. ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

    本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask ...

  3. 一分钟让你了解Microsoft Edge

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. 一个尖括号能干什么,画一个笑脸开始(为了支持交互,它又增添了JavaScript。HTML页面也越来越臃肿。于是CSS便诞生了。API和核心代码的出现使HTML能够访问更复杂的软件功能--支持更高级的交互和云服务集成。这就是今天的HTML5)

    一个尖括号 < 一个尖括号能干什么 < ? 你可以编出一顶帽子 <(:-p 或一张笑脸 :-> 再或者更直接一些 20世纪90年代初,html作为一种简单标记语言面世,用于在互 ...

  5. CSS自适应宽度的高级应用,一般人不会告诉你。

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxgAAACdCAIAAAC4iknFAAAgAElEQVR4nO2d3VsTV7uH51/wqhKotn

  6. YTU 2782: 用数字造数字

    2782: 用数字造数字 时间限制: 1 Sec  内存限制: 128 MB 提交: 191  解决: 160 题目描述 输入一个3位以上的整数,求其中最大的数字最小的数字之间的差.例如:输入8729 ...

  7. .NET平台下Redis使用(二)【StackExchange.Redis学习】

    Program.cs内容: using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Data; usi ...

  8. shell脚本-高级变量

    shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...

  9. [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁

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

  10. [转]Linux 正则表达式详解

    转自:http://www.jb51.net/article/42989.htm 一.linux文本查找命令 在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令: 1.gre ...