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+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
Nov 06 Python
python 日志增量抓取实现方法
Apr 28 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 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
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
JavaScript 的继承
2011/10/01 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Django配置文件代码说明
2019/12/04 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
python help函数实例用法
2020/12/06 Python
法国在线药房:DoctiPharma
2020/10/21 全球购物
厂长助理岗位职责
2013/12/27 职场文书
大学毕业自我评价
2014/02/02 职场文书
委托证明模板
2014/09/16 职场文书
毕业证代领委托书
2014/09/26 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
公司股东出资证明书
2014/11/01 职场文书
西湖英语导游词
2015/02/06 职场文书
宇宙与人观后感
2015/06/05 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
python基础入门之字典和集合
2021/06/13 Python