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 相关文章推荐
Django实现图片文字同时提交的方法
May 26 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python如何去除字符串中不想要的字符
Jul 05 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
如何利用Python识别图片中的文字
May 31 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
Python torch.flatten()函数案例详解
Aug 30 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中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Python+Opencv识别两张相似图片
2020/03/23 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
智能室内花园:Click & Grow
2021/01/29 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
电力工程合作意向书
2015/05/11 职场文书
老员工辞职信范文
2015/05/12 职场文书
六年级作文之关于梦
2019/10/22 职场文书
用python自动生成日历
2021/04/24 Python
go类型转换及与C的类型转换方式
2021/05/05 Golang
Golang生成Excel文档的方法步骤
2021/06/09 Golang
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
如何利用python创作字符画
2022/06/25 Python