方块游戏—题解

基于python的小游戏 含源代码 Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战Python项目实战 立即下载
 1590 - 方块游戏


Time Limit: 1s Memory Limit: 128MB


Submissions: 33 Solved: 13 
DescriptionBG和ZZ一起玩一个游戏,游戏规则如下:
       游戏开始时画在一张纸上,纸上画有n*m个方块组成的格子,BG和ZZ轮流玩这个游戏,BG先开始。每一轮玩家都会在上一次的方框内框出一个小方框作为下一轮的方框,这个小方框的边和原先的方框的边不能够有交集。
       这个游戏没有赢家,BG和ZZ只是不断的缩小方框,直到游戏进行k轮。现求游戏有多少种方法。(即游戏从初始状态到进行k轮后的任意状态的路径数目)。Input输入包括多组数据,每组数据为一行,每行有3个整数n,m,k(其中1 ≤ n, m, k ≤ 1000)。Output每组数据输出一行,每行为一个整数ans,表示游戏的方法数量,由于数量可能很大,请输出答案对1000000007求余的结果。
Sample Input3 3 1
4 4 1
6 7 2

Sample Output1
9
75


方法一:(模拟)
import java.util.Scanner;

public class Asist
{
	/**   
	 *   (1)
	 *    dp1[i][j] 代表  (i+2) * (j+2)个方块组成的格子进行 1 轮的总方法数 !(数学归纳法获知的!——可以打印出来看看)
	 *    
	 *   (2)
	 *    关于这个式子:sum=sum+test(k-1, i-2, j-2)*(n-i+1)*(m-j+1);
	 *      a) test(k, i, j) 求的是  i * j 个方块组成的格子进行k轮的总可行数! (废话了!)
	 *      
	 *      b) 至于这个式子的来历,我举个实际例子吧,(一般我的解题思路都是先举出一个实际例子、然后对其他情况加以证明而完成的、)
	 *   
	 *    1. 对于给定的n, m, k, 必须满足  n >= 2k+1 && m >= 2k+1才可有可行方案,否则输出 0;  (很容易证明, 也是关键点!)
	 *    
	 *    例子:
	 *         n  m  k
	 *         7  8  3   
	 *     说明:  每进行一轮时, 此时方框的最外层是不可取的, 也就是说,实际最大可取方框为 (n-2) *  (m-2)
	 *     
	 *    第一轮, 应至少取出   x * y 个方框,(其中 n >= x >= 2*k - 1 && m >= y >= 2*k - 1  ),此时 n = 5, m = 6, k = 3,
	 *           这样做方面配合我的 dp1[][]数组,才这样的。
	 *         这一轮的可行取法有:    
	 *                           i,j
	 *                       1.  5,5      这种取法的方式有 2 次       ——   
	 *                                                        次数  = (n-i+1) * (m-j+1) (很容易证明)
	 *                       2.  5,6      这种取法的方式有 1次       ——
	 *                       
	 *    第二轮, 根据前一轮的答案,同理的做法。 第一轮中有两种符合的情况:
	 *      1.   n  m  k   
	 *           5  5  2
	 *        完成一轮操作, 应至少取出   x * y 个方框,(其中 n >= x >= 2*k - 1 && m >= y >= 2*k - 1  ),此时 n = 3, m = 3, k = 2,
	 *      这种情况,这一轮的取法有:
	 *                      i, j
	 *                   1. 3, 3  这种取法的方式有1次
	 *      2.  n  m  k    
	 *          5  6  2
	 *        完成一轮操作, 应至少取出   x * y 个方框,(其中 n >= x >= 2*k - 1 && m >= y >= 2*k - 1  ),此时 n = 3, m = 4, k = 2,
	 *      这种情况,这一轮的取法有:
	 *                      i, j
	 *                   1. 3, 3  这种取法的方式有2次 
	 *                   2. 3, 4 这种取法的方式有1次
	 *     第三轮,根据前一轮的答案,同理
	 *      1.  n  m  k   
	 *          3  3  1
	 *         当 k = 1时,就好说了, 因为我的dp1[] 就是解决 k=1的。  此时n = 1, m = 1, k = 1,
	 *         结果是: dp[1][1] * 1(第三轮1次) * 1(第二轮1次) * 2(第一轮2次) = 2
	 *      2.  n  m  k   
	 *          3  3  1
	 *         结果是: dp[1][1] * 1(第三轮1次) * 2(第二轮2次) * 1(第一轮1次) = 2
	 *      3.  n  m  k
	 *          3  4  1
	 *         结果是: dp[1][2] * 1 * 1 * 1 = 3;
	 *         
	 *       综上所述:   sum = 2 + 2 + 3 = 7;
	 */ 
	public static final int MOD = 1000000007;
	public static int dp1[][];                            // 记录一个初始状态
	public static long dp2[][] = new long[1000][1000];    // 记忆化搜索
	public static void main(String[] args)
 	{ 
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int k = sc.nextInt();
		
		// 初始化 dp1 数组
		 dp1 = new int[1000][1000];
		for (int i = 1; i < 1000 ; i++)
		{
		    dp1[1][i] = i * (i+1) / 2;  
		    dp1[i][1] = dp1[1][i];
		}
		for (int i = 2; i < 1000; i++)
		{
			for (int j = 2; j < 1000; j++)
			{
			   dp1[i][j] = dp1[i][1] * dp1[1][j];
			}
		}
		
	   //模拟游戏
	    System.out.println(test(k, n-2, m-2));
 	}
	
	private static long test(int k, int n, int m)
	{
		if (k == 1)
		{
			return dp1[n][m];
		}
		if (dp2[n][m]!=0) return dp2[n][m];
		
		long sum = 0;
		int temp = 2*k-1;
		
		for (int i = temp; i <= n; i++)
		{
			for (int j = temp; j <= m; j++)
			{
				sum = (sum + (test(k-1, i-2, j-2)%MOD * (n-i+1)%MOD * (m-j+1)%MOD) % MOD)%MOD;
			}
		}
		
		dp2[n][m] = sum;   // 记忆
		return sum;
	}
}


方法二:(组合数学问题) 上代码
import java.util.Scanner;


public class Main
{
	public static final int MOD = 1000000007;
	public static void main(String[] args)
 	{ 
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int k = sc.nextInt();
		
		System.out.println(test(2*k,n-1)*test(2*k,m-1)%MOD);
 	}
	
	private static long test(int n, int m)
	{
         if (n > (m / 2)) n = m-n;
         
         long sum = 1;
         for (int i = 0; i < n; i++) sum = (sum * (m-i)) % MOD;
         long sun = 1;
         for (int i = 2; i <= n; i++) sun = (sun * i) % MOD;
         
         return sum / sun;
	}
}




python_红心大战游戏源代码_满分原创作业 python编写红心大战游戏,满分作业,音效动画传牌等效果酷炫。 立即下载

相关推荐

用方向键控制小方块移动的java小程序

我自己编的一个java小程序,就是如何用方向键控制小方块移动 ,不过有些缺陷,比如按上和右小方块不会斜着移动。希望各位高手帮我点评一下这个程序的好坏。

Blocks 题解

DFS四向搜,遇上类型不同或找过或出界,返回false。

m0_74486855的博客 1064

方块游戏

塔围攻1

【题解】格子游戏

题目描述 Alice和Bob玩了一个古老的游戏:首先画一个n × n的点阵(下图n = 3) 接着,他们两个轮流在相邻的点之间画上红边和蓝边: 直到围成一个封闭的圈(面积不必为1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了(n ≤ 200),他们的游戏实在是太长了!他们甚至在游戏中都不知道谁赢得了游戏。于是请你写一...

weixin_30826761的博客 886

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3435

用SimaPro做碳足迹分析:手把手教你完成产品生命周期评估报告

本文详细介绍了如何使用SimaPro进行碳足迹分析,从软件安装到生命周期评估报告的完整流程。通过实战案例演示,帮助制造业企业、咨询机构和科研团队掌握产品生命周期评估(LCA)的核心技术,精准识别环境热点并优化决策,为可持续发展转型提供科学依据。

yhn45678901的博客 711

bzoj3376&&poj1988 [Usaco2004 Open]Cube Stacking 方块游戏 解题报告

题目描述 1.bzoj 3376 传送门 2.poj 1988 传送门 想说的话 这道题我很早就做过了 当时就是并查集专题 但是那个时候的我并不知道带权并查集 就是稀里糊涂的抄了题解 昨天刚刚正式学会带权并查集 于是乎我来写一发题解 题解 都说了是带权并查集 而且并查集这个思路也好想 不过就是M到一根柱子上的就合并 这里我们维护三个数值 如下图 father[x]表示x这

M.L.B 565

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5910

【题解】codevs P1108 方块游戏

搜索+自行模拟,注意边界情况限制xy的范围 #include&lt;cstdio&gt; #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cstdlib&gt; #include&lt;cstring&gt; using namespace std; int m,n; char color[55][55]; bool...

Rem_Inory的博客 279

C# MES通信从入门到精通(10)——C#使用HTTP的Post和Get方法和Mes系统通信

本文详细介绍了如何利用C#完成与HTTP协议的MES系统进行通信,通过POST和GET方法实现与MES系统的交互,由高级工程师的实战经验总结,实属C#与MES通信领域的葵花宝典!

qq_34059233的博客 3412

手搓UDS Bootloader|全网独家复现0x10诊断会话控制、详解会话跳转规则与S3超时机制、助力ECU在线刷写、固件迭代、车规安全升级落地

在车载UDS诊断(ISO 14229)与Bootloader固件升级架构中,0x10诊断会话控制服务是所有高级诊断、固件刷写功能的前置核心与权限管控入口,属于UDS基础必实现服务。车载ECU通过分级会话模式,隔离常规故障诊断、高级标定、固件重编程等高、低权限操作,从协议层面保障车载电控系统的安全性与稳定性。多数嵌入式开发者开发UDS Bootloader时,仅简单实现会话切换报文应答,未吃透会话强制跳转规则、S3安全超时机制、会话权限绑定、APP在线刷写跳转逻辑。

getusushu的博客 465

2025 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)第五题题解

码量最大的一集,感觉这场就倒数的三道题,就得写个三四百行.感觉挺好的很少有比赛这么强调调码力.题目:RC-u5 游戏设计师Bloxorz 是一款很经典的 Flash 游戏。这款游戏需要你将一个特殊的长方块滚到当前平面上的特定位置。一个可能的初始状态具体来说,一个关卡的“平面”是一个矩形区域,由多个单位格子组成。而长方块由两个完美对齐的单位立方体组成,它可以横卧(占据两个不相邻的格子),也可以竖立(占据一个格子)。

bjfkdndb的博客 1512

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

luogu1312 Mayan游戏 剪枝

题目大意 Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个77行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那...

weixin_30305735的博客 113

YOLO26 改进 | (教师:YOLOv8L,学生:YOLO26) | 知识蒸馏 (Knowledge Distillation)

本文介绍了基于YOLO26框架的知识蒸馏实战方法,通过教师模型指导学生模型训练,在不增加推理成本的情况下提升模型精度。文章详细阐述了基于响应的知识蒸馏实现方案,通过最小化教师与学生模型预测Logits间的KL散度实现知识迁移。核心实现包括:1) 创建DistillationModel包装器类,同时运行师生模型;2) 自定义DistillationLoss,在原检测损失基础上增加KL散度损失。该方法适用于希望保持YOLO26轻量级特性同时获得接近大模型精度的场景,文中提供了完整的代码实现方案。

weixin_51988935的博客 510

【100%通过率】华为od统一考试B卷【贪吃蛇】Python 实现

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。给定一个N*M的数组arr,代表N*M个方格组成的版图,贪吃蛇每次移动一个方格。若arr[i][j] == ‘H’,表示该方格为贪吃蛇的起始位置;若arr[i][j] == ‘F’,表示该方格为食物,若arr[i][j] == ‘E’,表示该方格为空格。贪吃蛇初始长度为1,初始移动方向为向左。

MISAYAONE的博客 1202

[题解] [NOIP2011 提高组] Mayan 游戏

有一个7行5列的格子棋盘,有的格子上有方块。方块有重力,即如果一个方块下面没有其他方块,他就会往下掉,直到触底或者下面有方块为止。每个方块都有自己的颜色,如果连着三个竖着或者横着的方块颜色相同,它们就会消除。如果出现了共用方块的情况,则共用这一个方块的两组全部消除。你可以进行n步操作,每一步操作如下:选择一个方块,将它向左移动一格或者向右移动一格,如果移动的目标格子已经有方块了,就交换这两个方块。如果移动后有方块悬空,它们就会落下。你的目标是消除所有的方块。

東木的博客 999

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++【例题】泡泡龙

泡泡龙

zaqyaf110_kun114的博客 322

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【NOIP 2011】Mayan游戏(搜索+模拟)

描述 Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。**游戏通关是指在规定的步数内消除所有的方块,**消除方块的规则如下: 1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方...

weixin_30710457的博客 210

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Educational Codeforces Round 68 (Rated for Div. 2)(A,B,C,D)

比赛链接 A. Remove a Progression 题意:有一个1~n的序列,每次从头开始删掉第i个数,问到不能删除的时候第x的位置上的数是多少。 题意:简单推一下,发现每次删掉的数都是奇数。那么能保留的x位置上的数就是x*2。 #include<bits/stdc++.h> using namespace std; int main() { int T; cin&...

qq_42129242的博客 202

ccf题解 201604-2 俄罗斯方块 python(代码行少)

ccf题解 201604-2 俄罗斯方块 python 嗨~大家好!因为报名了最近的CCF考试,所以在练习中,分享一下个人认为相对简单的代码,若是有不对的地方,欢迎大家指正!!! 问题描述:暂略,有时间会搬过来哒! 题目分析:题目读起来有些麻烦,不过相信大家都玩过俄罗斯方块,本题就好像一个简化版的俄罗斯方块游戏,落下的板块是一个横条,长度在4以内,下落的区域则是一个4*15的方格纸,板块是直线下落...

weixin_42127496的博客 702

题解 -NOIp2011 Day1T3 Mayan游戏(mayan.cpp/.c/.pas)

-NOIp2011 Day1T3 Mayan游戏(mayan.cpp/.c/.pas) 欢迎来到本蒟蒻的题解 题目 Mayan 游戏 (mayan.cpp/c/pas) 问题描述 Mayan puzzle 是最近流行起来的一个游戏。游戏界面是一个 7 行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是...

wangyixin_oier的博客 412

BZOJ3376: [Usaco2004 Open]Cube Stacking 方块游戏

【传送门:BZOJ3376】 简要题意:   约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种:   1.移动(M):将包含X的立方柱移动到包含Y的立方柱上.   2.统计(C):统计名含X的立方柱中,在X下方的方块数目. 写个程序帮贝茜完成游戏. ...

weixin_30600197的博客 308

[POJ1390]Blocks(区间dp)

为什么我的优快云审核这么慢?

薇小薇 458

字符串匹配的降维打击:用游戏化思维理解优先级栈

本文通过游戏化思维解析字符串匹配中的优先级栈概念,将括号匹配问题类比为俄罗斯方块游戏,直观展示栈结构的应用。文章详细介绍了优先级规则、LeetCode真题解析及现实应用场景,帮助开发者深入理解并掌握这一核心算法技术。

ol789012的博客 171
上一篇: 垒骰子—题解
下一篇: 21位水仙花数—题解
慕一春
博客等级 码龄12年 19粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值