HDU 4832 Chess
Chess
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 812 Accepted Submission(s): 325
Problem Description
小度和小良最近又迷上了下棋。棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M)。在他们的规则中,“王”在棋盘上的走法遵循十字路线。也就是说,如果“王”当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个。

图1 黄色部分为棋子所控制的范围
小度觉得每次都是小良赢,没意思。为了难倒小良,他想出了这样一个问题:如果一开始“王”在(x0,y0)点,小良对“王”连续移动恰好K步,一共可以有多少种不同的移动方案?两种方案相同,当且仅当它们的K次移动全部都是一样的。也就是说,先向左再向右移动,和先向右再向左移动被认为是不同的方案。
小良被难倒了。你能写程序解决这个问题吗?
Input
输入包括多组数据。输入数据的第一行是一个整数T(T≤10),表示测试数据的组数。
每组测试数据只包括一行,为五个整数N,M,K,x0,y0。(1≤N,M,K≤1000,1≤x0≤N,1≤y0≤M)
Output
对于第k组数据,第一行输出Case #k:,第二行输出所求的方案数。由于答案可能非常大,你只需要输出结果对9999991取模之后的值即可。
Sample Input
2
2 2 1 1 1
2 2 2 1 1
Sample Output
Case #1:
2
Case #2:
4
Source
[2014年百度之星程序设计大赛 - 初赛(第二轮)](http://acm.hdu.edu.cn/search.php?field=problem&key=2014%C4%EA%B0%D9%B6%C8%D6%AE%D0%C7%B3%CC%D0%F2%C9%E8%BC%C6%B4%F3%C8%FC+-+%B3%F5%C8%FC%A3%A8%B5%DA%B6%FE%C2%D6%A3%A9&source=1&searchmode=source)
解析:直接进行DP会超时。由于行列独立,可以分开计数,做2个一维的DP,然后组合起来就可以了。
```
#include
#include
#define ll long long
const int MOD = 9999991;
const int MAXN = 1005;
int N, M, K, x0, y0;
ll dp[2][MAXN][MAXN];
ll sum[2][MAXN];
int C[MAXN][MAXN];
void init()
{
C[0][0] = 1;
for(int i = 1; i < MAXN; ++i){
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; ++j)
C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
}
}
void work(int n, int t, int p)
{
dp[p][0][t] = 1;
sum[p][0] = 1;
for(int i = 1; i <= K; ++i){
for(int j = 1; j <= n; ++j){
if(j - 1 > 0) dp[p][i][j] += dp[p][i-1][j-1];
if(j - 2 > 0) dp[p][i][j] += dp[p][i-1][j-2];
if(j + 1 <= n) dp[p][i][j] += dp[p][i-1][j+1];
if(j + 2 <= n) dp[p][i][j] += dp[p][i-1][j+2];
dp[p][i][j] %= MOD;
sum[p][i] = (sum[p][i] + dp[p][i][j]) % MOD;
}
}
}
void solve()
{
memset(sum, 0, sizeof(sum));
memset(dp, 0, sizeof(dp));
work(N, x0, 0);
work(M, y0, 1);
long long res = 0;
for(int i = 0; i <= K; ++i)
res = (res + (((C[K][i] * sum[1][i]) % MOD) * sum[0][K-i]) % MOD) % MOD;
printf("%I64d\n", res);
}
int main()
{
init();
int t, cn = 0;
scanf("%d", &t);
while(t--){
scanf("%d%d%d%d%d", &N, &M, &K, &x0, &y0);
printf("Case #%d:\n", ++cn);
solve();
}
}
HDU 4832 Chess的更多相关文章
- HDU 4832 Chess (DP)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 4832 Chess(dp)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...
- HDU 4832(DP+计数问题)
HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...
- HDU 5724 Chess(国际象棋)
HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 6787 Chess 2020百度之星 初赛三 T5 题解 dp
传送门:HDU 6787 Chess Problem Description 你现在有一个棋盘,上面有 n 个格子,格子从左往右,1,-,n 进行标号.你可以在棋盘上放置恰好 m 个传送器,并且对于每 ...
- HDU 5724 Chess (sg函数)
Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...
- HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 5742 Chess SG函数博弈
Chess Problem Description Alice and Bob are playing a special chess game on an n × 20 chessboard. ...
随机推荐
- CF 353A Domino
#include<stdio.h> #include<math.h> int main() { int i,n; int x,y; int m1,m2,m3,m4; while ...
- servlet学习笔记二
Servlet主要内容: 1)表单处理 2)乱码问题 3)页面跳转 4)生命周期 一.表单处理 Servlet获取表单数据 request.getParameter():通过表单参数名获取参数值 re ...
- KETTLE、spoon使用
ETL是Extract”.“ Transform” .“Load”三个单词的首字母缩写分别代表了抽取.转换.装载.是数据仓库中重要的一环.ETL是数据的抽取清洗转换加载的过程,是数据进入数据仓库进行大 ...
- 怎么样能让自己的虚拟机上网win7 for linux
我的电脑是win7 32位 虚拟机是linux 我是通过无线连接互联网的 点无线网络连接 右键 点共享 按照我的方式设置 接下来进入 里面会自动的选择这个 如果没有可以自己按照这个设置 接下来进入虚拟 ...
- myplan
告警集成平台 – OneAlert(空) JumpServer-开源跳板机(堡垒机)搭建(空) Suricata入侵检测.防御系统搭建(空) Snort入侵检测系统搭建(空) OpenVas开放式漏洞 ...
- Linux功能-验证网络配置
显示IP地址.设别和MAC地址等信息# ip addr show br0 订正:以下截图中硬件mac地址为第三行的"link/ether"一行所在的地方. ip命令可用在网络性能方 ...
- ExtJs布局大全
1.Fit 布局 在Fit 布局中,子元素将自动填满整个父容器.注意:在fit 布局下,对其子元素设置宽度是无效的.如果在fit 布局中放置了多个组件,则只会显示第一个子元素.在Fit 布局中,子元素 ...
- JSP或HTML命名规范
1.jsp与html文件名全部小写 2.数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”或者其他的单词.例如:news_message.ht ...
- Js判断一个单词是否有重复字母
今天上午刷到一道题,大体是写一个方法判断一个单词中是否有重复的字母(或者说一个字符串中是否有重复的字符).我的思路是一个字符一个字符地遍历,如果发现有重复的停止: function isIsogram ...
- 【分享】Maven插件的源码下载(SVN)
偶然的情况下找到了Maven插件源码的网址,现分享下 http://svn.apache.org/repos/asf/maven/plugins/ 可以使用SVN下载,在添加新的资源路径时,把上面的网 ...