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点 ...
随机推荐
- android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件
我们先来看看优酷的控件是怎么回事? 仅仅响应最后也就是最顶部的卡片的点击事件,假设点击的不是最顶部的卡片那么就先把它放到最顶部.然后在移动到最前面来.重复如次. 知道了这几条那么我们就非常好做了. 里 ...
- 西门子TCP/UDPport
通过TCP和UDP数据传输的不同服务用到了哪些port? func=ll&objid=21874445&nodeid0=10806074&load=treecontent&am ...
- java学习笔记:文件名区分大小写
我按照网上的教程,写了JAVA第一个程序:Hello World!,出了两个问题,都栽在 大小写 上. public class Hello { public static void main(Str ...
- java.lang.NoClassDefFoundError: org/apache/commons/lang/xwork/StringUtils
java.lang.NoClassDefFoundError: org/apache/commons/lang/xwork/StringUtils Struts2框架下使用JSON插件时.程序保存找不 ...
- oc82--成员变量使用copy修饰
// // Person.h #import <Foundation/Foundation.h> typedef void (^myBlock)(); @interface Person ...
- Timus 1009. K-based Numbers
1009. K-based Numbers Time limit: 0.5 secondMemory limit: 64 MB Let’s consider K-based numbers, cont ...
- bzoj 3993 星际战争
题目大意: X军团和Y军团正在激烈地作战 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai 当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机 ...
- loj 101 最大流
冬令营送到我脸上的20分都没拿全 心态爆炸 冬令营前一天学的dinic 后一天才发出来 #include<iostream> #include<cstdio> #include ...
- 【POJ 3349】 Snowflake Snow Snowflakes
[题目链接] http://poj.org/problem?id=3349 [算法] 哈希 若两片雪花相同,则它们六个角上的和一定相同,不妨令 H(A) = sigma(Ai) % P ,每次只要到哈 ...
- PCB 720全景图嵌入登入界面应用实现
通常软件主界面或登入界面背景图片通常采用固定图片,这里介绍如何将720度全景图嵌入到登入界面中来, 这里用的素材来源于这里上个月在公司里拍摄的全景图, 一.拍摄720度全景图片, 建议:最好用三角固定 ...