此系列是我用kotlin二刷leetcode写的总结,会总结用各个方法做的题目以及心得,主要是剑指offer专栏的题目
dfs bfs
第一题剑指offer13
思路:一般的dfs遍历就可以,注意kotlin的数组初始化方式,此处用了kotlin的自定义操作符,定义了Point类重写了+的方法,可以实现求出数字在题目中的数值
细节:此处注意,定义机器人可以前往的点的时候一定要定义上下左右四个方向的点,不然在16,8,4的例子会出现有一块区域机器人去不了,如果在之前加入了所有的点就会产生错误的答案
代码:
class jz_offer_13 {
var res=0
fun movingCount(m: Int, n: Int, k: Int): Int {
val check=Array(n){i -> Array(m,{0}) }
goNext(0,0,n,m,k,check)
return res
}
fun goNext(x:Int,y:Int,height:Int,width:Int,k:Int,check:Array<Array<Int>>){
if(x==width||y==height||x<0||y<0||check[y][x]==1)return
check[y][x]=1
var sum= Point(x) + Point(y)
if(sum>k)return
res++
val steps=getNext(x,y)
steps.forEach { goNext(x+it[0],y+it[1],height,width,k,check) }
}
fun getNext(x:Int,y:Int):Array<Array<Int>>{
val moving= arrayOf(arrayOf(1,0), arrayOf(0,1), arrayOf(-1,0), arrayOf(0,-1))
return moving
}
class Point(val num: Int){
var x:Int = 0
get() {
var num0=this.num
var value:Int=0
while (num0>=10) {
value+=num0/10
num0%=10
}
value+=num0
return value
}
operator fun plus(other: Point):Int{
return other.x+this.x
}
}
}