P1002 过河卒 【递推、简单动规】
题目描述
棋盘上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 过河卒 【递推、简单动规】的更多相关文章
- bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望
[bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...
- 【bzoj1042】[HAOI2008]硬币购物-递推与动规-容斥原理
硬币购物 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一行 c1,c2 ...
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- 洛谷P1002 过河卒 [2017年4月计划 动态规划15]
P1002 过河卒 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之 ...
- P1002 过河卒【dp】
P1002 过河卒 题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制 ...
- 洛谷P1002 过河卒【dp】
棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒 ...
- 洛谷 P1002 过河卒 【棋盘dp】
题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- 洛谷P1002 过河卒
关于蒟蒻的我,刚刚接触DP.... 那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...
- 洛谷[P1002]过河卒
原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
随机推荐
- 查看及更改MySQL数据库物理文件存放的位置
查看命令: mysql> show global variables like "%datadir%"; 表格第二行即为文件的位置.另外,可以在该文件夹的配置文件my.i ...
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...
- 线段树+离散化 IP地址段检查 SEGMENT TREE
Problem: Give a series of IP segments, for example, [0.0.0.1-0.0.0.3], [123.234.232.21-123.245.21.1] ...
- oc const 关键字 对指针的理解
/* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...
- "未能载入文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件"的解决方式
今天在写反射调用的时候失败了,经过调试和分析,终于攻克了,以下我就详细说明. 一,报错的现象 未能载入文件或程序集"DalSQL"或它的某一个依赖项.系统找不到指定的文件. 说明: ...
- Codeforces #2B The least round way(DP)
Description 有一个n*n的正整数矩阵,要你求一条从第一行第一列的格子到第n行第n列的路,使得你走过的格子里面的数乘起来的值末尾的零的个数最小.输出最小个数. Input 第一行包括1个数n ...
- 快学Scala习题解答—第十章 特质
10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...
- 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法
重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码, 于是就会用到Surfa ...
- 数组和字符串长度length
数组.length 字符串.length() list list.size();map map.size();set set.size();1 java中的length属性是针对数组说的,比如说你声明 ...
- 2-sat总结
算法 构造一个有向图G,每个变量xi拆成两个点2i和2i+1 分别表示xi为假,xi为真 那么对于“xi为真或xj为假”这样的条件 我们就需要连接两条边 2*i —>2*j(表示如果i为假,那么 ...