python机器人行走步数问题的解决

本文实例为大家分享了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(",",c,")") 
    for x in matrix: 
      for y in x:  
        print(y,end=' ') 
      print() 
 
 #回溯法 
  def hasPath(self,threshold,cols): 
    visited = [ [0 for j in range(cols)] for i in range(rows) ] 
    count = 0 
    startx = 0 
    starty = 0 
    #print(threshold,visited) 
    visited = self.findpath(threshold,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,curx,cury,prex,prey): 
    if 0 <= curx < rows and 0 <= cury < cols and self.PD_K1(curx,threshold) and visited[curx][cury] != 1: # 判断当前点是否满足条件 
      visited[curx][cury] = 1 
    self.printMatrix(visited,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,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,prey) 
    elif curx+1 < rows and self.PD_K1(curx+1,threshold) and visited[curx+1][cury] != 1: # sourth 
      visited[curx+1][cury] = 1 
      return self.findpath(threshold,curx+1,prey) 
    elif 0 <= curx-1 and self.PD_K1(curx-1,threshold) and visited[curx-1][cury] != 1: # north 
      visited[curx-1][cury] = 1 
      return self.findpath(threshold,curx-1,prey) 
    else: # 返回上一层,此处有问题 
      return visited#self.findpath(threshold,prey) 
 #回溯法2 
  def movingCount(self,cols): 
    visited = [ [0 for j in range(cols)] for i in range(rows) ] 
    print(visited) 
    count = self.movingCountCore(threshold,visited); 
    print(visited) 
    return count 
 
  def movingCountCore(self,row,col,visited): 
    cc = 0 
    if(self.check(threshold,visited)):  
      visited[row][col] = 1 
      cc = 1 + self.movingCountCore(threshold,row+1,visited) + self.movingCountCore(threshold,col+1,row-1,col-1,visited) 
    return cc 
 
  def check(self,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,k): 
    count = 0 
    for i in range(rows): 
      for j in range(cols): 
        if self.PD_K(i,k): 
          count+=1 
    return count 
# 暴力法2,用递归法来做 
  def block(self,k):  
    s = sum(map(int,str(r)+str(c))) 
    return s>k 
  def con_visited(self,cols): 
    visited = [ [0 for j in range(cols)] for i in range(rows) ] 
    return visited 
  def traval(self,k,visited): 
    if not (0<=r<rows and 0<=c<cols): 
      return 
    if visited[r][c] != 0 or self.block(r,k): 
      visited[r][c] = -1 
      return 
    visited[r][c] = 1 
    global acc 
    acc+=1 
    self.traval(r+1,visited) 
    self.traval(r,c+1,visited) 
    self.traval(r-1,c-1,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,o.con_visited(m,n))) 
  print(o.movingCount(k,n)) 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

相关文章

在前一篇博客中我们介绍了加侧旋的乒乓球弧圈技术的模拟,本...
在近期conda的版本更新中,有可能会删除路径下的_sysconfigd...
本文主要展示了一些lambda表达式的使用示例,通过这些示例,...
本文通过对比Jax和Numpy计算Normalized Hamming Distance的过...
我们知道GPU加速在可并行化程度比较高的算法中,能够发挥出比...
Numpy这个库在Python编程中非常的常用,不仅在性能上补足了P...