python机器人行走步数问题的解决


Posted in Python onJanuary 29, 2018

本文实例为大家分享了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))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Python编程学习之如何判断3个数的大小
Aug 07 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
Django框架表单操作实例分析
Nov 04 Python
Django配置文件代码说明
Dec 04 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python同时处理多个异常的方法
Jul 28 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
python的socket编程入门
Jan 29 #Python
Python 错误和异常代码详解
Jan 29 #Python
python实现机器人行走效果
Jan 29 #Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
详解Python自建logging模块
Jan 29 #Python
python抓取网页中链接的静态图片
Jan 29 #Python
You might like
php基于自定义函数记录log日志方法
2017/07/21 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
javascript void(0)的妙用
2009/10/21 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python匹配中文的正则表达式
2016/05/11 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
Form表单及django的form表单的补充
2019/07/25 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
Python实现自动整理文件的脚本
2020/12/17 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
旅游管理专业生自荐信范文
2014/01/02 职场文书
单位同意报考证明
2015/06/17 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Feign调用传输文件异常的解决
2021/06/24 Java/Android
postgresql中如何执行sql文件
2023/05/08 PostgreSQL