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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
使用Python脚本生成随机IP的简单方法
Jul 30 Python
python简易远程控制单线程版
Jun 20 Python
Django model序列化为json的方法示例
Oct 16 Python
Python中的类与类型示例详解
Jul 10 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
Python标准库itertools的使用方法
Jan 17 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
Python排序函数的使用方法详解
Dec 11 Python
Python-split()函数实例用法讲解
Dec 18 Python
Python WSGI 规范简介
Apr 11 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
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
JavaScript的继承的封装介绍
2013/10/15 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
解决python3输入的坑——input()
2020/12/05 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
电子商务个人自荐信
2013/12/12 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
世界红十字日活动总结
2015/02/10 职场文书
天河观后感
2015/06/11 职场文书
重阳节简报
2015/07/20 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书