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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
python中的闭包函数
Feb 09 Python
教你使用python画一朵花送女朋友
Mar 29 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
Python generator生成器和yield表达式详解
Aug 08 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
Python numpy多维数组实现原理详解
Mar 10 Python
Python获取浏览器窗口句柄过程解析
Jul 25 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安装攻略:常见问题解答(一)
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
node网页分段渲染详解
2016/09/05 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Python上传package到Pypi(代码简单)
2016/02/06 Python
python编程实现希尔排序
2017/04/13 Python
Django异步任务线程池实现原理
2019/12/17 Python
python程序文件扩展名知识点详解
2020/02/27 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
给幼儿园老师的表扬信
2014/01/19 职场文书
司机检讨书
2014/02/13 职场文书
元旦晚会感言
2014/03/12 职场文书
春节联欢会主持词
2014/03/24 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
检讨书模板
2015/01/29 职场文书
后天观后感
2015/06/08 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
python用字节处理文件实例讲解
2021/04/13 Python
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL