马踏棋盘python_马踏棋盘python实现
import collections
import random
class CheckerBoard(object):
"""
初始化棋盘
"""
def __init__(self, LEN):
self.LEN = LEN
self.position_has_gone = set()
def init_checkerboard(self):
position = []
for i in range(1, self.LEN + 1):
line = []
for j in range(1, self.LEN + 1):
line.append((i, j))
position.append(line)
return position
def init_hourse_position(self):
x = random.randint(1, self.LEN)
y = random.randint(1, self.LEN)
self.position_has_gone.add((x, y))
return (x, y)
def get_next_positions(self, init_position):
next_position = []
x, y = init_position
if x - 1 >= 1:
if y - 2 >= 1:
next_position.append((x - 1, y - 2))
if y + 2 <= self.LEN:
next_position.append((x - 1, y + 2))
if x - 2 >= 1:
if y - 1 >= 1:
next_position.append((x - 2, y - 1))
if y + 1 <= self.LEN:
next_position.append((x - 2, y + 1))
if x + 1 <= 8:
if y - 2 >= 1:
next_position.append((x + 1, y - 2))
if y + 2 <= self.LEN:
next_position.append((x + 1, y + 2))
if x + 2 <= self.LEN:
if y - 1 >= 1:
next_position.append((x + 2, y - 1))
if y + 1 <= self.LEN:
next_position.append((x + 2, y + 1))
return list(set(next_position) - self.position_has_gone) # 列表
def choose_next_position(self, next_positions, no_ok_position):
"""
贪心选择下一步的下一步选择方案最小的路
:param next_positions: 下一步可以选择的位置
:param house_position: 本身的位置
:return:下一步走的位置
"""
min_choice = 9
min_index = 0
if no_ok_position:
next_positions = list(set(next_positions) - set(no_ok_position))
if len(next_positions) == 0:
print('saaa')
return False
for index, position in enumerate(next_positions):
choice = len(self.get_next_positions(position))
if choice < min_choice:
min_choice = choice
min_index = index
self.position_has_gone.add(next_positions[min_index])
return next_positions[min_index]
LEN = 8
trace = [] # 有序字典,用于记录每步的位置
checkerboard_obj = CheckerBoard(LEN)
checkerboard = checkerboard_obj.init_checkerboard() # 获取棋盘所有格子
house_position = checkerboard_obj.init_hourse_position() # 获取马的初始位置
trace.append(house_position)
# 获取马的下一个可能位置
print('初始化位置', house_position)
while len(checkerboard_obj.position_has_gone) < LEN * LEN: # 当没有走完全部格子时,继续走下一步直至走完
next_positions = checkerboard_obj.get_next_positions(house_position)
next_step = checkerboard_obj.choose_next_position(next_positions, no_ok_position=None)
if next_step == False:
break
else:
house_position = next_step
trace.append(next_step)
print(trace)
showList = []
for i in range(8):
line = []
for j in range(8):
line.append(j)
showList.append(line)
for index, item in enumerate(trace):
showList[item[0] - 1][item[1] - 1] = index + 1
for item in showList:
print(item)
马踏棋盘python_马踏棋盘python实现相关推荐
- 不要去追一匹马,用追马的时间种草
不要去追一匹马,用追马的时间种草,待到春暖花开时,就会有一批骏马任你挑选:不要去刻意巴结一个人,用暂时没有朋友的时间,去提升自己的能力,待到时机成熟时,就会有一批的朋友与你同行.用人情做出来的朋友只是 ...
- 费马素数(费马质数)
0x01 普遍形式 费马素数也叫费马质数. 其中 n 为非负整数. 0x02 历史 法国数学家费马于1640年提出了以下猜想: 可以看出,前4个是质数,因为第5个数实在太大了,费马认为是质数. 由此提 ...
- 未来的两马之争,马化腾如何才能打赢马云?
论身高,马云目测165左右,马化腾173以上,两者差距接近10cm. 论年龄,马化腾出生于1971年,今年47岁,马云出生于1964年,今年54岁,不管身高和年龄,真打起来马云都没有优势啊. 所以真实 ...
- html画布创建黑白象棋棋盘,Canvas绘制象棋棋盘
学习Canvas可以通过一些例子来增加成就感 一下是一个输出一个象棋棋盘的例子 象棋棋盘 //以要画的点为原点定义四个象限 var pointDefine=[[-1,-1],[1,-1],[-1,1] ...
- 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- 一键复制php代码,PHP_php下批量挂马和批量清马代码,复制代码 代码如下:?php funct - phpStudy...
php下批量挂马和批量清马代码 复制代码 代码如下: function gmfun($path=".") { $d = @dir($path); while(false !== ( ...
- java棋盘覆盖分治法,棋盘覆盖-分治法
信 息 工 程 学 院 算法分析 实习报告 学院:信息工程学院 班级:软件工程083 姓名: 学号: 成绩: 一.实习题目 : 棋盘覆盖 二.实习过程 : 1.了解分治法的思想: 将一个难以解决的大问 ...
- 网马的反挂马检测及精确投放(免杀)
前天shadow在群里提到或许可以采取一些方法来实现对挂马检测系统的绕过,遂与其深入探讨了下,事后又考虑到网马的精确投放,总结了一些点做了点儿技术实现 ,并在这里简单记录下想到的一些想法,欢迎其他大牛 ...
- 孙溟㠭展为尼泊尔驻华大使‘马赫什·库马尔·马斯基‘治印篆刻印章
<马赫什·库马尔·马斯基>--孙溟㠭篆刻 溟㠭(展)和尼泊尔驻华大使'马赫什·库马尔·马斯基'先生 <马赫什·库马尔·马斯基>----孙溟㠭治印篆刻印章
最新文章
- 判断一个IP区间(或IP)是否被另一个IP区间所包含
- 奔溃啦~有什么软件适合 Java 程序编写? | 每日趣闻
- python速度比较_Python和C运算速度对比实测
- babel 转换箭头函数
- html左侧分级导航,jquery实现无限分级横向导航菜单的方法
- CSDN内容颜色、位置以及图片大小改变
- Active Diretory 全攻略(五)--规划和建立组
- 前端学习(3253):react脚手架文件介绍
- codeforces 266B-C语言解题报告
- 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引
- while 常见程序逻辑
- css3禅密花园叫什么名字_CSS秘密花园:灵活的椭圆形
- Java中的常用异常处理方法
- officescan使用apache跳轉設置
- oracle 触发器代码,Oracle触发器实例代码
- Redis高级项目实战,2021最新Java大厂面试真题大全
- C语言bmp转JPEG不用库函数,C++图片格式转换:BMP转JPEG
- matlab程序产生OAM波,一种反射型极化转换超表面的轨道角动量产生结构设计的制作方法...
- Word 2010 从任意页码重新开始
- 家庭局域网接入Internet