坏巧克力 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。

本文主要是介绍坏巧克力 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

坏巧克力问题:

      两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。在这个游戏中,先走好还是后走好?

     写一个互动程序,让大家可以和计算机玩这个游戏。这个程序在胜局应该走出致胜一步,在败局中则只要随机下出合规的一步就好。

import numpy as np
#定义一个m*n矩阵,初始化时,默认其值均为1。随机选择一个位置另其为0,代表坏巧克力。
# 生成巧克力
def Create_Choclate():print('输入巧克力的大小m*n')m = int(input('输入 m:'))n = int(input('输入n:'))Sum = m*n #巧克力块总数chocolate = np.ones(Sum).reshape(m, n)return chocolate, m, n#随机一个位置 置为0,生成坏巧克力
def Create_Bad(chocolate,m,n):x = np.random.randint(0, m)y = np.random.randint(0, n)chocolate[x][y] = 0print('生成的坏巧克力')print(chocolate)return chocolate,x,y #返回坏的巧克力,和坏巧克力的下标#掰巧克力操作,默认吃掉不含坏巧克力的一半
def Split(Chocolate_Bad, x, y ,m ,n): #xy mn分别为坏巧克力的横纵坐标,巧克力的当前大小m*nprint('沿着一个方向水平或者垂直(x或者y)及下标a~b中间掰开(下标从0开始)')aix = input('选择掰开的方向为:')indexa = int(input('a='))indexb = int(input('b='))if(aix =='x'): #沿着水平方向掰开if(indexb>x):#当掰开的位置在坏的下边Chocolate_Bad = Chocolate_Bad[0:indexb, :]x=xy=ym=indexbn=nelif(indexb<x or indexb == x):#当掰开的位置在坏的上边Chocolate_Bad = Chocolate_Bad[indexb:m, :]x=x-indexby=ym=m-indexbn=nelse:print('输入错误')elif(aix == 'y'):#沿着竖直掰if (indexb > y):#当掰开的位置在坏的右边Chocolate_Bad = Chocolate_Bad[:, 0:indexb]x=xy=ym=mn=indexbelif (indexb < y or indexb == y):#当掰开的位置在坏的左边Chocolate_Bad = Chocolate_Bad[:, indexb:n]x=xy=y-indexbm=mn=n-indexbelse:print('输入错误')return Chocolate_Bad,x,y,m,ndef main():Chocolate_good,m,n = Create_Choclate()Chocolate_Bad, x, y = Create_Bad(Chocolate_good, m, n)print('坏巧克力下标(%d,%d) '%(x,y))while(m>1 or n>1):Chocolate_Bad,x,y,m,n = Split(Chocolate_Bad, x, y, m, n)print('吃掉一块后为')print(Chocolate_Bad)print('当前坏巧克力的坐标为(%d,%d),巧克力的大小为(%d,%d)'%(x, y, m, n))if((m==1 and n==2) or (m==2 and n==1)):print('你赢了')print('游戏结束,你输了')if __name__ == "__main__":main()

这篇关于坏巧克力 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的。每次掰只能顺着方格的边界,沿直线一掰到底。每掰一次,掰的人把两块中不含坏巧克力的那块吃掉,谁碰到最后那块坏巧克力就算输了。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815494

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

电脑多久清理一次灰尘合? 合理清理电脑上灰尘的科普文

《电脑多久清理一次灰尘合?合理清理电脑上灰尘的科普文》聊起电脑清理灰尘这个话题,我可有不少话要说,你知道吗,电脑就像个勤劳的工人,每天不停地为我们服务,但时间一长,它也会“出汗”——也就是积累灰尘,... 灰尘的堆积几乎是所有电脑用户面临的问题。无论你的房间有多干净,或者你的电脑是否安装了灰尘过滤器,灰尘都

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p