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实现相关推荐

  1. 不要去追一匹马,用追马的时间种草

    不要去追一匹马,用追马的时间种草,待到春暖花开时,就会有一批骏马任你挑选:不要去刻意巴结一个人,用暂时没有朋友的时间,去提升自己的能力,待到时机成熟时,就会有一批的朋友与你同行.用人情做出来的朋友只是 ...

  2. 费马素数(费马质数)

    0x01 普遍形式 费马素数也叫费马质数. 其中 n 为非负整数. 0x02 历史 法国数学家费马于1640年提出了以下猜想: 可以看出,前4个是质数,因为第5个数实在太大了,费马认为是质数. 由此提 ...

  3. 未来的两马之争,马化腾如何才能打赢马云?

    论身高,马云目测165左右,马化腾173以上,两者差距接近10cm. 论年龄,马化腾出生于1971年,今年47岁,马云出生于1964年,今年54岁,不管身高和年龄,真打起来马云都没有优势啊. 所以真实 ...

  4. html画布创建黑白象棋棋盘,Canvas绘制象棋棋盘

    学习Canvas可以通过一些例子来增加成就感 一下是一个输出一个象棋棋盘的例子 象棋棋盘 //以要画的点为原点定义四个象限 var pointDefine=[[-1,-1],[1,-1],[-1,1] ...

  5. 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

  6. 一键复制php代码,PHP_php下批量挂马和批量清马代码,复制代码 代码如下:?php funct - phpStudy...

    php下批量挂马和批量清马代码 复制代码 代码如下: function gmfun($path=".") { $d = @dir($path); while(false !== ( ...

  7. java棋盘覆盖分治法,棋盘覆盖-分治法

    信 息 工 程 学 院 算法分析 实习报告 学院:信息工程学院 班级:软件工程083 姓名: 学号: 成绩: 一.实习题目 : 棋盘覆盖 二.实习过程 : 1.了解分治法的思想: 将一个难以解决的大问 ...

  8. 网马的反挂马检测及精确投放(免杀)

    前天shadow在群里提到或许可以采取一些方法来实现对挂马检测系统的绕过,遂与其深入探讨了下,事后又考虑到网马的精确投放,总结了一些点做了点儿技术实现 ,并在这里简单记录下想到的一些想法,欢迎其他大牛 ...

  9. 孙溟㠭展为尼泊尔驻华大使‘马赫什·库马尔·马斯基‘治印篆刻印章

    <马赫什·库马尔·马斯基>--孙溟㠭篆刻 溟㠭(展)和尼泊尔驻华大使'马赫什·库马尔·马斯基'先生 <马赫什·库马尔·马斯基>----孙溟㠭治印篆刻印章

最新文章

  1. 判断一个IP区间(或IP)是否被另一个IP区间所包含
  2. 奔溃啦~有什么软件适合 Java 程序编写? | 每日趣闻
  3. python速度比较_Python和C运算速度对比实测
  4. babel 转换箭头函数
  5. html左侧分级导航,jquery实现无限分级横向导航菜单的方法
  6. CSDN内容颜色、位置以及图片大小改变
  7. Active Diretory 全攻略(五)--规划和建立组
  8. 前端学习(3253):react脚手架文件介绍
  9. codeforces 266B-C语言解题报告
  10. 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引
  11. while 常见程序逻辑
  12. css3禅密花园叫什么名字_CSS秘密花园:灵活的椭圆形
  13. Java中的常用异常处理方法
  14. officescan使用apache跳轉設置
  15. oracle 触发器代码,Oracle触发器实例代码
  16. Redis高级项目实战,2021最新Java大厂面试真题大全
  17. C语言bmp转JPEG不用库函数,C++图片格式转换:BMP转JPEG
  18. matlab程序产生OAM波,一种反射型极化转换超表面的轨道角动量产生结构设计的制作方法...
  19. Word 2010 从任意页码重新开始
  20. 家庭局域网接入Internet

热门文章

  1. css3中的渐变效果及花斑动画的实现
  2. 蔬菜名称大全500种_96种室内盆栽植物图片及名称,室内植物品种大全
  3. Cesium颜色调整
  4. vm 和 容器对比_您将VM放在我的容器中
  5. 什么是边缘计算边缘计算_什么是边缘计算?
  6. 笔记随笔1(webpack,vue-router,vuex)
  7. 前端:JS/30/综合实例:选项卡(HTML,CSS,JS)
  8. 第十一章:李淳风的秘谋
  9. 使用函数处理数组 高阶函数 js
  10. Bootstrap 轮番插件Collapse 调用方式