【openjudge】【递推】例3.6 过河卒(Noip2002)
【题目描述】
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。
【输入】
给出n、m和C点的坐标。
【输出】
从A点能够到达B点的路径的条数。
【输入样例】 【输出样例】
输入输出样例
【算法分析:】
20*20的格子用dfs会超时,标算应该是递推.
f[i][j]表示从点(0, 0)到达点(i, j)的路径条数,vis[i][j]为1表示点(i, j)是马的控制点
递推式由分类加法很容易得到:
f[i][j] = f[i - 1][j] + f[i][j - 1];
i, j >= 1 、i <= n 、j <= m、vis[i][j] = 0
比较需要注意的是初始化:
不能只是把边界点赋成1,如果边界上有马的控制点就GG了..
如果这个点是马的控制点,其后的所有点都无法到达
有一种比较方便的初始化写法:
f[][] = vis[][] ^ ;
for(int i = ; i <= m; i++) f[][i] = f[][i - ] ^ vis[][i];
for(int i = ; i <= n; i++) f[i][] = f[i - ][] ^ vis[i][];
【代码:】
#include<iostream>
#include<cstdio>
using namespace std; const int dx[] = {, , , , -, -, -, -};
const int dy[] = {, -, , -, , -, , -}; //注意开long long
long long n, m, xc, yc;
long long ans, f[][];
bool vis[][]; int main() {
scanf("%lld%lld%lld%lld", &n, &m, &xc, &yc);
vis[xc][yc] = ;
for(int i = ; i < ; i++) {
int xx = xc + dx[i], yy = yc + dy[i];
if(xx <= n && yy <= m && xx >= && yy >= )
vis[xc + dx[i]][yc + dy[i]] = ;
}
f[][] = vis[][] ^ ;
for(int i = ; i <= m; i++) f[][i] = f[][i - ] ^ vis[][i];
for(int i = ; i <= n; i++) f[i][] = f[i - ][] ^ vis[i][]; for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(!vis[i][j])
f[i][j] = f[i - ][j] + f[i][j - ];
}
}
printf("%lld\n", f[n][m]);
}
【openjudge】【递推】例3.6 过河卒(Noip2002)的更多相关文章
- 过河卒(Noip2002)(dp)
过河卒(Noip2002) 时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 6[提交][状态][讨论版][命题人:quanxing] 题目描述 棋盘上A点有一个过河卒,需要走到 ...
- 过河卒(NOIP2002)
题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...
- 【9307】&【a303】过河卒(NOIP2002)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- P1002 过河卒 【递推、简单动规】
题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒 ...
- 【openjudge】【递推】例3.4 昆虫繁殖
[题目描述] 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵 ...
- C语言程序设计100例之(20):过河卒
例20 过河卒 题目描述 如图1,在棋盘的A点有一个过河卒,需要走到目标B点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如图1的C点),该马所在的点和所有跳跃一步可达的点称 ...
- 递推2--过河卒(Noip2002)
递推2--过河卒(Noip2002) 一.心得 写出递推公式就OK了,具体编程还是很简单的 二.题目及分析 过河卒(NOIp2002) [问题描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的 ...
- 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)
HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ...
随机推荐
- Java代理(三)
前面说到了java的动态代理,但是动态代理依赖于接口,这次来看看cglib来实现的代理... 假设有如下方法,这回没有说接口哦~ package proxy.cglibProxy; public cl ...
- IDEA下的第一个springBoot
1.第一步打开File->New->Project,SDK根据自己的需要选择,我这边选的是java7 2.Next之后 设置group 和artifact,根据自己的需要进行修改. 3.导 ...
- xamarin.Android SQLite存储
在可移植类库 新建: using SQLite.Net.Interop; using System; using System.Collections.Generic; using System.Li ...
- Spring Boot—09通过Form提交的映射
package com.sample.smartmap.controller; import org.springframework.beans.factory.annotation.Autowire ...
- 报表在IBM AIX系统下resin部署
报表是用java开发的,具有良好的跨平台性.不仅可以应用在windows.linux.操作系统,还可以应用在AIX等等的unix操作系统.在各种操作系统上部署过程有一些差别.下面说一下在AIX操 ...
- Eclipse Ctrl + H 搜索文件不覆盖已打开文件解决办法
1.windows------->preferences
- lodop 二维码内容多少
QRCode最多能放181个汉字:LODOP.ADD_PRINT_BARCODE(248,6,60,60,"QRCode","一二三四五六七八九十二二三四五六七八九十三二 ...
- gitlab上如何添加二进制文件(设计文档)
想将设计文档(原型设计图,UML设计图等)放到gitlab上,以供团队其他成员查看.将这些二进制文件跟源码一样纳入git管控显然是不合适的.经过一番摸索,找到了如何管理项目文档的方法. 根据Stack ...
- 关于nicescroll滚动条现在浏览器上滚动问题
nativeparentscrolling: false //检测内容底部,并让父节点来滚动,作为原生滚动 有时候 当自定义滚动条在底部 滚动无效 可以把这个参数设置一下
- UIWindow的windowLevel详解
UIWindow的windowLevel详解