标题链接

标题描绘

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方分外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人可以进入方格 [35, 37] ,因为3+5+矩阵类似3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人可以抵达多少个格子?

示例 1:
输入:m = 2, n = 3, k = 1
输出:3

git教程例 2:
输入:m = 3, n = 1, k = 0
输出:1

提示:
1 &lgithubt;= n,m <= 100
0 <= k<= 20

题解

可以把方格看做一个mnm times n矩阵。在这个矩矩阵类似阵中,除距离以外的格子之外,矩阵等价其他格子都有四个相邻的格子。

  1. 机器人从坐标(0,0)(0,0)开始移动
  2. 当机器人github预备进入到(i,j)(i,j)时,判别机器人能否进入到该格子
  3. 判别机器人是否能进入格子的条件是git教程,行和列的位数之和小于k,并且机器人github中文官网网页也没有进入过次格子
  4. 若不能进入,则不去查验进入到它周围github是干什么的的格子。
  5. 若能进入,则让机器人分别去查验进入它周围的四个格子(i−1,j),(i+1,j),(i,j+1),(i,j−1), (i-1,j) , (i+1,j) , (i,j+1) , (i,j-1) ,,而因为格子是从(0,0)(0,0)开始的,只需要向上和gitlab向右就能进入到全部能抵达的格子,所以只需让机器人分别去查验进入它上面或右面的格子 (i+1,j),(i,j+1),(i+1git教程,j) , (i,j+1) , 。也便是gitee回到第2步。

代码

首先用结构体Grid来标明m行n列的方格

//用来标明每个格子的坐标
typealias Coordinate = (row:Int,column:Int)
struct Gr矩阵的迹id {
let row : Int //行数
let column : Int //列数
//原点giti轮胎坐标
var ori矩阵相乘怎样算ginCoordinate : Coorgit指令dinate {
return (row:0,column:0)
}
//在方格内指定坐标的上面的格子,若上面已没有格子,则回来nil
func above(coor:Coordin矩阵的迹ate) -> Coordinate? {
igitlabfgit教程 coor.row >= 0 &&矩阵计算器 coor.row < row - 1 && coor.column >= 0 &&amgiteep; coor.column < column{
return (row:coor.row + 1,column:coor.column)
}
return nil
}
//在方格内指定坐标的下面的格子,若下面github是干什么的已没有格子,则回来nil
func below(coor:Coordinate) -> Coordinate? {
if coor.row > 0 && coor.row < row && coor.column >= 0 && coor.github永久回家地址column < colugit教程mn{
return (row:coor.row - 1,column:coor.column)
}
return nil
}
//在方格内指定坐标的左面的格子,若左面已没有格子,则回来nil
func left(coor:Coordinate) -> Coorgit指令dinate? {
if coor矩阵天王.giti轮胎row >= 0 && coor.roGitw < row && coor.column > 0 &git教程amp;& coor.column &l矩阵的迹t; column矩阵的迹{
r矩阵游戏eturn (row:coor.row,c矩阵相乘怎样算olumn:coor.column - 1)
}
return nil
}
//在方格内指定坐标的右面的格子,若右面已没有格子,则回来niGitl
func right(coor:Coordinate) -> Coordinate? {
if coor.row >= 0 && coor.row &l矩阵类似t; rgitlabow && coor.column >= 0 && coor.column < column - 1{
return (row:coor.row,col矩阵天王umn:coor.column + 1)
}
return nil
}
}

然后在用github中文官网网页结构体Robot来标明机器人

struct Robot {
let k : Int
let grid : Grid //格子
init(k :Int, grid: Grid) {
self.k = k
self.grid = grid
}
//对外露出的方法,做了一些数据的初始化和距离的矩阵的秩判别。内部调用了private func movingCount(coor:Coordinate? , visited:inout [Bool]) -> Int
func movingCount() -矩阵的秩> Int {
guard k >= 0, grid.column > 0, grid.row > 0 elgit指令se { return 0 }
var visited = Array(re矩阵等价peating: false, count: grid.row * grid.columgiti轮胎n)
let count = movingCount(coor: grid.origingit教程Coordinate , visited : &visited)github是干什么的
return count
}
//结束上面的思路
private func movingCount(coor:Coordinate? , visitgithub是干什么的ed:inout [Bool]) -> Int {
if lgitiet coor = coor , isVaild(coor: coor, visited: visited) {
visited[coor.row * grid.column + coorgiti.column] = true
return 1 + movingCount(coor:grid.a矩阵的逆bove(coor: coor), visited: &矩阵乘法visited)
+ movingCount(coor:grid.right(coor: coor), visited: &visited)
}
return 0
}
//用来判别是否能进入到此格子
private func isVaild(coor:Coordinate , visited : [Bool]) -> Bool {
return visited[coor矩阵的逆.row * grid.column + coor.column] ==Git false &agithubmp;& (diGitgitsSum(number: coor.row) + digitsSum(number: coor.column) <= k)
}
//求一个github永久回家地址数字的位数之和
private func digitsSum(number:Int) -> Int {
var sum = 0
var topDigit = number
whil矩阵相乘怎样算e topDgithub永久回家地址igit > 0 {
sum += topDigitgithub是干什么的 % 10
topDigit = topDigit / 10
}
return sum
}
}