博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中国象棋
阅读量:5050 次
发布时间:2019-06-12

本文共 1896 字,大约阅读时间需要 6 分钟。

中国象棋

【题目描述】

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。

大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。

你也来和小可可一起锻炼一下思维吧!

【输入格式】

一行包含两个整数N,M,之间由一个空格隔开。

【输出格式】

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

【数据规模】

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6

解析

动态规划题。

令f[i][j][k]表示前i行,放一个炮的有j列,放两个炮的有k列,边界为f[0][0][0]=1,,

则状态转移方程有以下几种:

1、不放:f[i][j][k]=f[i][j][k]+f[i-1][j][k];

2、放一个在零个的那列:f[i][j][k]=f[i][j][k]+f[i-1][j-1][k]*(m-j-k+1);

3、放一个在一个的那列:f[i][j][k]=f[i][j][k]+f[i-1][j+1][k-1]*(j+1);

4、分别放一个在一个的两列:f[i][j][k]=f[i][j][k]+f[i-1][j+2][k-2]*(j+1)*(j+2)/2;

5、分别放一个在零个的一列和一个的一列:f[i][j][k]=f[i][j][k]+f[i-1][j][k-1]*j*(m-j-k+1);

6、分别放一个在零个的两列:f[i][j][k]=f[i][j][k]+f[i-1][j-2][k]*(m-j-k+1)*(m-j-k+2)/2。

要注意各种情况的先决条件!最后的答案是所有f[n][j][k]的总和。记得开long long!!!

Code

#include 
#include
#include
#include
#include
#include
using namespace std;const int mod=9999973;int n,m;long long f[101][101][101],ans;//f[i][j][k]表示前i行,放一个炮的有j列,放两个炮的有k列 int main(){ memset(f,0,sizeof(f)); cin>>n>>m; f[0][0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=m-j;k++) { f[i][j][k]=(f[i][j][k]+f[i-1][j][k])%mod;//不放 if(j)//放一个在零个的那列 f[i][j][k]=(f[i][j][k]+f[i-1][j-1][k]*(m-j-k+1))%mod;//(m-j-k+1)即原来零个的总列数 if(k)//放一个在一个的那列 f[i][j][k]=(f[i][j][k]+f[i-1][j+1][k-1]*(j+1))%mod;//(j+1)即原来一个的总列数 if(k>=2)//分别放一个在一个的两列 f[i][j][k]=(f[i][j][k]+f[i-1][j+2][k-2]*(j+1)*(j+2)/2)%mod;//(j+2)即原来有两列为一个的总列数 if(j&&k)//分别放一个在零个的一列和一个的一列 f[i][j][k]=(f[i][j][k]+f[i-1][j][k-1]*j*(m-j-k+1))%mod; if(j>=2)//分别放一个在零个的两列 f[i][j][k]=(f[i][j][k]+f[i-1][j-2][k]*(m-j-k+1)*(m-j-k+2)/2)%mod; } for(int j=0;j<=m;j++) for(int k=0;k<=m-j;k++) ans=(ans+f[n][j][k])%mod;//累加答案 cout<
View Code

 

转载于:https://www.cnblogs.com/I-Love-You-520/p/11187691.html

你可能感兴趣的文章
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Equal Sides Of An Array
查看>>
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>