https://www.luogu.org/problem/P1002

题目描述

如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C不等于A,同时C不等于B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。。

输入描述:

输入B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}

输出描述:

输出一个整数(路径的条数)。

示例1

输入

   

输出


说明/提示

结果可能很大!

一开始按DFS做,超时

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI=acos(-);
const int maxn=;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); int n,m,x,y;
int ans; bool judge(int a,int b)
{
if(a==x&&b==y)
return false;
if(a==x-&&b==y-)
return false;
if(a==x-&&b==y-)
return false;
if(a==x+&&b==y-)
return false;
if(a==x+&&b==y-)
return false;
if(a==x-&&b==y+)
return false;
if(a==x+&&b==y+)
return false;
if(a==x-&&b==y+)
return false;
if(a==x+&&b==y+)
return false;
return true;
} void DFS(int a,int b)
{
if(a==n&&b==m)
{
ans++;
return ;
}
if(a+<=n&&judge(a+,b))
DFS(a+,b);
if(b+<=m&&judge(a,b+))
DFS(a,b+);
} int main()
{
scanf("%d %d %d %d",&n,&m,&x,&y);
DFS(,);
printf("%d\n",ans);
return ;
}

后来以为if判断太多,换了种方法,依然超时

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI=acos(-);
const int maxn=;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); int n,m,x,y;
int G[][];
int ans; void DFS(int a,int b)
{
if(a==n&&b==m)
{
ans++;
return ;
}
if(a+<=n&&G[a+][b]==)
DFS(a+,b);
if(b+<=m&&G[a][b+]==)
DFS(a,b+);
return ;
} int main()
{
//freopen("testdate.in","r",stdin);
scanf("%d %d %d %d",&n,&m,&x,&y);
G[x][y]=;
if(x->=)
{
G[x-][y-]=;
G[x-][y+]=;
}
if(y->=)
{
G[x-][y-]=;
G[x+][y-]=;
}
if(x->=)
{
G[x-][y+]=;
}
if(y->=)
{
G[x+][y-]=;
}
G[x+][y+]=;
G[x+][y+]=;
DFS(,);
printf("%d\n",ans);
return ;
}

最后意识到,这题没那么简单.

看过题解才明白这题是记忆化递推,或者说是DP

DP题就是要找到状态转移方程,这题的状态转移方程只用手动模拟一下就可以了,就可以得出到每一个点的方案数就是上面和左边的方案数的总和(因为只可以向右走或向下走),具体的状态转移方程是

即可以写成DP[i][j]=max(DP[i][j],DP[i-1][j]+DP[i][j-1])

注意,最大的结果已经超过了int的范围,这是一个坑

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI=acos(-);
const int maxn=;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); int n,m,x,y;
LL DP[][];//DP[i][j]代表从A点到(i,j)的线路条数
bool G[][];//判断这个点有没有马盯着
//马可以走到的位置
int fx[]={,-,-,,,,,-,-};
int fy[]={,,,,,-,-,-,-}; int main()
{
scanf("%d %d %d %d",&n,&m,&x,&y);
n+=;m+=,x+=,y+=;//坐标加2,防止标记马时越界
for(int i=;i<=;i++)//标记马的位置
{
G[x+fx[i]][y+fy[i]]=true;
}
DP[][]=;//初始化
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(G[i][j])
continue;
DP[i][j]=max(DP[i][j],DP[i-][j]+DP[i][j-]);//状态转移方程
}
}
printf("%lld\n",DP[n][m]);
return ;
}

下面粘一个有意思的代码(递推):

我们可以发现一个规律:每个数都等于它上面左边的数的和

 #include <iostream>
using namespace std; int n,m,my,mx;
long long a[][]; int main()
{
cin >>n >>m >>my >>mx;//输入数据
n=n+;m=m+;my=my+;mx=mx+; //隔出两格,当要把马可跳到的地方掷成0时不会出错
for(int z=;z<=m;z++)
{
for(int y=;y<=n;y++)
{
a[z][y]=a[z-][y]+a[z][y-]; //将这个数左边和上面的数相加
a[][]=;//由于会把起点掷成0,所以要回归1
a[mx][my]=;//将马的地方掷成0
a[mx+][my+]=;a[mx+][my-]=;//将马可跳到的地方掷成0
a[mx-][my+]=;a[mx-][my-]=;//将马可跳到的地方掷成0
a[mx+][my+]=;a[mx+][my-]=;//将马可跳到的地方掷成0
a[mx-][my+]=;a[mx-][my-]=;//将马可跳到的地方掷成0
}
}
cout <<a[m][n];//输出结果
return ;
}

NOIP2002 过河卒(DFS,DP)的更多相关文章

  1. SDUT 1265-马停下过河卒(DFS)

    马拦过河卒 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit3000ms Memory Limit 65536K ...

  2. 洛谷P1002 过河卒【dp】

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

  3. NOIP 2002过河卒 Label:dp

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

  4. P1002 过河卒【dp】

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

  5. 洛谷 - P1002 - 过河卒 - 简单dp

    https://www.luogu.org/problemnew/show/P1002 方程很好想,题目也很暴力.感谢题目提示数据会很大. #include<bits/stdc++.h> ...

  6. 过河卒(Noip2002)(dp)

    过河卒(Noip2002) 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 6[提交][状态][讨论版][命题人:quanxing] 题目描述 棋盘上A点有一个过河卒,需要走到 ...

  7. dp练习(4)——过河卒

    1010 过河卒 2002年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 如图,A ...

  8. 【openjudge】【递推】例3.6 过河卒(Noip2002)

    [题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...

  9. 过河卒 NOIp 2002 dp

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

随机推荐

  1. 四、Antd组件扩展

    注意:先安装扩展,在安装antd框架,否则会提示 一.安装扩展 1.组件 dva 查看项目依赖 原因是我全局安装,依赖为空, npm i dva 查看依赖 cli装global 当访问报错: Warn ...

  2. CF #610Div2 B2.K for the Price of One (Hard Version) (dp解法 && 贪心解法)

    原题链接:http://codeforces.com/contest/1282/problem/B2题目大意:刚开始有 p 块钱,商店有 n 件物品,你每次可以只买一件付那一件的钱,也可以买 k 件只 ...

  3. MySQL性能管理及架构设计:第1章 实例和故事

    1-1 什么决定了电商双11大促的成败 数据库架构 1-2 在双11大促中的数据库服务器 通过监控信息从而确定:哪些因素影响了数据库性能? 1-3 在大促中什么影响了数据库性能 1-4 大表带来的问题 ...

  4. pywin32获得tkinter的Canvas窗口句柄,并在上面绘图

    上一篇博文获得主窗口句柄使用的是root.frame或者通过子控件调用master.frame方法,但是子控件本身没有frame方法.那么怎么获得子控件的句柄呢?试过了很多办法,想过把Canvas当作 ...

  5. CENTOS YUM更新源

    网络yum源和制作本地光盘yum源 配置CENTOS YUM更新源 yum安装rpm包安装后本地不清除的方法 sed -i 's#keepcache=0#keepcache=1#g' /etc/yum ...

  6. Java 面向对象的帮助文档制作(6)

    set classPath=c:\myclass; 设置path路径

  7. 基于基因调控网络(Hopfield network)构建沃丁顿表观遗传景观

    基因调控网络的概念在之前已经简要介绍过:https://www.cnblogs.com/pear-linzhu/p/12313951.html 沃丁顿表观遗传景观(The Waddington's e ...

  8. share团队冲刺4

    团队冲刺第四天 昨天:进行各种按钮的操作,自定义按钮颜色形状 今天:设置布局,账号密码的输入,选择框 问题:无

  9. catalina.out日志膨胀问题解决实例,日志门面commons-logging的实践

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 笔者在公司的时候,遇到一个问题,2个模块A.B Tomcat中的catalina.out及catalina ...

  10. 吴裕雄--天生自然TensorFlow高层封装:Estimator-DNNClassifier

    # 1. 模型定义. import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist impor ...