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爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
python正则表达式面试题解答
Apr 28 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
Python get获取页面cookie代码实例
Sep 12 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
使用python turtle画高达
Jan 19 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
python mock测试的示例
Oct 19 Python
python实现简单反弹球游戏
Apr 12 Python
Python基础之tkinter图形化界面学习
Apr 29 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
Terran剧情介绍
2020/03/14 星际争霸
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
PHP 实现链式操作
2021/03/09 PHP
基于jQuery试卷自动排版系统
2010/07/18 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
python的类方法和静态方法
2014/12/13 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python实现俄罗斯方块游戏
2020/03/25 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
法学专业毕业生自荐信范文
2013/12/18 职场文书
机关搬迁方案
2014/05/18 职场文书
美术学专业求职信
2014/07/23 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
民间借贷被告代理词
2015/05/23 职场文书
关于军训的感想
2015/08/07 职场文书
导游词之天津古文化街
2019/11/09 职场文书
mysql部分操作
2021/04/05 MySQL
springboot中一些比较常用的注解总结
2021/06/11 Java/Android