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 相关文章推荐
Python 条件判断的缩写方法
Sep 06 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
不要用强制方法杀掉python线程
Feb 26 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
Python 3.8新特征之asyncio REPL
May 28 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
Python调用C/C++的方法解析
Aug 05 Python
python如何用matplotlib创建三维图表
Jan 26 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
详解Python自建logging模块
Jan 29 #Python
python抓取网页中链接的静态图片
Jan 29 #Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 #Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 #Python
Python实现识别手写数字大纲
Jan 29 #Python
You might like
PHP遍历二维数组的代码
2011/04/22 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
Display SQL Server Version Information
2007/06/21 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
JS的数组迭代方法
2015/02/05 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python获取android设备的GPS信息脚本分享
2015/03/06 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
使用Python对SQLite数据库操作
2017/04/06 Python
Python 修改列表中的元素方法
2018/06/26 Python
python 实现多维数组转向量
2019/11/30 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Keras自定义IOU方式
2020/06/10 Python
python如何写try语句
2020/07/14 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
奠基仪式策划方案
2014/05/15 职场文书
2014年电教工作总结
2014/12/19 职场文书
会计工作岗位职责
2015/02/03 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
收入证明申请书
2015/06/12 职场文书
Python中异常处理用法
2021/11/27 Python