python机器人行走步数问题的解决
作者:zoujm-hust12 发布时间:2023-12-24 23:26:05
标签:python,机器人
本文实例为大家分享了python机器人行走步数问题,供大家参考,具体内容如下
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# fileName : robot_path.py
# author : zoujiameng@aliyun.com.cn
# 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
# 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class Robot:
# 共用接口,判断是否超过K
def getDigitSum(self, num):
sumD = 0
while(num>0):
sumD+=num%10
num/=10
return int(sumD)
def PD_K(self, rows, cols, K):
sumK = self.getDigitSum(rows) + self.getDigitSum(cols)
if sumK > K:
return False
else:
return True
def PD_K1(self, i, j, k):
"确定该位置是否可以走,将复杂约束条件设定"
index = map(str,[i,j])
sum_ij = 0
for x in index:
for y in x:
sum_ij += int(y)
if sum_ij <= k:
return True
else:
return False
# 共用接口,打印遍历的visited二维list
def printMatrix(self, matrix, r, c):
print("cur location(", r, ",", c, ")")
for x in matrix:
for y in x:
print(y, end=' ')
print()
#回溯法
def hasPath(self, threshold, rows, cols):
visited = [ [0 for j in range(cols)] for i in range(rows) ]
count = 0
startx = 0
starty = 0
#print(threshold, rows, cols, visited)
visited = self.findPath(threshold, rows, cols, visited, startx, starty, -1, -1)
for x in visited:
for y in x:
if( y == 1):
count+=1
print(visited)
return count
def findPath(self, threshold, rows, cols, visited, curx, cury, prex, prey):
if 0 <= curx < rows and 0 <= cury < cols and self.PD_K1(curx, cury, threshold) and visited[curx][cury] != 1: # 判断当前点是否满足条件
visited[curx][cury] = 1
self.printMatrix(visited, curx, cury)
prex = curx
prey = cury
if cury+1 < cols and self.PD_K1(curx, cury+1, threshold) and visited[curx][cury+1] != 1: # east
visited[curx][cury+1] = 1
return self.findPath(threshold, rows, cols, visited, curx, cury+1, prex, prey)
elif cury-1 >= 0 and self.PD_K1(curx, cury-1, threshold) and visited[curx][cury-1] != 1: # west
visited[curx][cury-1] = 1
return self.findPath(threshold, rows, cols, visited, curx, cury-1, prex, prey)
elif curx+1 < rows and self.PD_K1(curx+1, cury, threshold) and visited[curx+1][cury] != 1: # sourth
visited[curx+1][cury] = 1
return self.findPath(threshold, rows, cols, visited, curx+1, cury, prex, prey)
elif 0 <= curx-1 and self.PD_K1(curx-1, cury, threshold) and visited[curx-1][cury] != 1: # north
visited[curx-1][cury] = 1
return self.findPath(threshold, rows, cols, visited, curx-1, cury, prex, prey)
else: # 返回上一层,此处有问题
return visited#self.findPath(threshold, rows, cols, visited, curx, cury, prex, prey)
#回溯法2
def movingCount(self, threshold, rows, cols):
visited = [ [0 for j in range(cols)] for i in range(rows) ]
print(visited)
count = self.movingCountCore(threshold, rows, cols, 0, 0, visited);
print(visited)
return count
def movingCountCore(self, threshold, rows, cols, row, col, visited):
cc = 0
if(self.check(threshold, rows, cols, row, col, visited)):
visited[row][col] = 1
cc = 1 + self.movingCountCore(threshold, rows, cols, row+1, col,visited) + self.movingCountCore(threshold, rows, cols, row, col+1, visited) + self.movingCountCore(threshold, rows, cols, row-1, col, visited) + self.movingCountCore(threshold, rows, cols, row, col-1, visited)
return cc
def check(self, threshold, rows, cols, row, col, visited):
if( 0 <= row < rows and 0 <= col < cols and (self.getDigitSum(row)+self.getDigitSum(col)) <= threshold and visited[row][col] != 1):
return True;
return False
# 暴力法,直接用当前坐标和K比较
def force(self, rows, cols, k):
count = 0
for i in range(rows):
for j in range(cols):
if self.PD_K(i, j, k):
count+=1
return count
# 暴力法2, 用递归法来做
def block(self, r, c, k):
s = sum(map(int, str(r)+str(c)))
return s>k
def con_visited(self, rows, cols):
visited = [ [0 for j in range(cols)] for i in range(rows) ]
return visited
def traval(self, r, c, rows, cols, k, visited):
if not (0<=r<rows and 0<=c<cols):
return
if visited[r][c] != 0 or self.block(r, c, k):
visited[r][c] = -1
return
visited[r][c] = 1
global acc
acc+=1
self.traval(r+1, c, rows, cols, k, visited)
self.traval(r, c+1, rows, cols, k, visited)
self.traval(r-1, c, rows, cols, k, visited)
self.traval(r, c-1, rows, cols, k, visited)
return acc
if __name__ == "__main__":
# 调用测试
m = 3
n = 3
k = 1
o = Robot()
print(o.hasPath(k, m, n))
print(o.force(m,n,k))
global acc
acc = 0
print(o.traval(0, 0, m, n, k, o.con_visited(m,n)))
print(o.movingCount(k, m, n))
来源:http://blog.csdn.net/shentong1/article/details/78775719


猜你喜欢
- defaultdict 主要用来需要对 value 做初始化的情形。对于字典来说,key 必须是 hashable,immutable,un
- Microsoft SQL Server 2008将包含用于合并两个行集(rowset)数据的新句法。根据一个源数据表对另一个数据表进行确定
- 在Microsoft OfficeAccess和 Microsoft OfficeExcel之间存在多种交换数据的方法。若要将Access中
- Windows环境下一、开启 Imagick 扩展1、安装PHP扩展:Imagick,下载地址 https://pecl.php.net/p
- 访问数组元素数组索引等同于访问数组元素。可以通过引用其索引号来访问数组元素。NumPy 数组中的索引以 0 开头,这意味着第一个元素的索引为
- 指定路径斜杠与反斜杠的问题报错:SyntaxError: (unicode error) ‘unicodeescape&
- 一、 图片转视频任务需求背景在标注数据的过程中,需要【反复】浏览大量图片(万张以上的数量级),确认图片中的目标类别以及室内户型布局。但是,在
- Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展,文件上传的方式越来越多样。而有一些文件上传的控件,要做自动化控制会更
- 给定一篇英语文章,要求统计出所有单词的个数,并按一定次序输出。思路是利用go语言的map类型,以每个单词作为关键字存储数量信息,代码实现如下
- 链表链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结
- 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义
- 由于并不清楚服务器具体地址,只有jupyter 连接的情况下,上传文件。方法一:用Linux命令直接用linux命令,在jupyter中只需
- 看了cragle的《有没有必要将网站Div+Css重构?》的文章,有一些想法不说不快,我也在文章的评论里提到曾经开除过两个执着使用div技术
- 包的使用1.首次导入模块发生的事情3件事情先产生一个执行文件的名称空间:1.创建模块文件的名称空间2.执行模块文件中的代码 将产生的名字放入
- 方法一: 在asp.net的aspx里面的源代码中 <input type="button onclick="ja
- 背景索引是把 * 剑,在提升查询速度的同时会减慢DML的操作。毕竟,索引的维护需要一定的成本。所以,对于索引,要加上该加的,删除无用的。前者是
- 误区 #12:TempDB的文件数和需要和CPU数目保持一致错误 哎,由于上述误区是微软“官方”的建议,
- 前言大家都知道其实学习Django非常简单,几乎不用花什么精力就可以入门了。配置一个url,分给一个函数处理它,返回response,几乎都
- 在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种
- 一开始用Firefox加Firebug/YSlow插件分析,但是firefox不能运行自定义的javascript,好像还要装什么插件。于是