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的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Python语言进阶知识点总结
May 28 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
python学习笔记之多进程
Aug 06 Python
Python如何实现远程方法调用
Aug 07 Python
通过代码简单了解django model序列化作用
Nov 12 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP Pear 安装及使用
2009/03/19 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
Python 实现链表实例代码
2017/04/07 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python执行时间的几种计算方法
2020/07/31 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
鸿星尔克广告词
2014/03/21 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
小学生运动会报道稿
2014/09/12 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android