import times, strutils, sequtils, math, algorithm, tables, sets, lists, intsets import critbits, future, strformat, deques template `max=`(x,y) = x = max(x,y) template `min=`(x,y) = x = min(x,y) template `mod=`(x,y) = x = x mod y template scan2 = (scan(), scan()) template scan3 = (scan(), scan()) let read* = iterator: string {.closure.} = while true: (for s in stdin.readLine.split: yield s) proc scan(): int = read().parseInt proc scanf(): float = read().parseFloat proc toInt(c:char): int = return int(c) - int('0') proc solve():int= var n = scan() m = scan() board = newseqwith(n,newseqwith(n,0)) costS = newseqwith(n,newseqwith(n,int.high.div(4))) costG = newseqwith(n,newseqwith(n,int.high.div(4))) fromS = newseqwith(n,newseq[(int,int)](n)) fromG = newseqwith(n,newseq[(int,int)](n)) costS[0][0]=0 costG[^1][^1]=0 for i in 0..0: var (h,w)=q.popFirst() if h-1>=0: if costS[h-1][w] > costS[h][w]+board[h-1][w]+1: costS[h-1][w] = costS[h][w]+board[h-1][w]+1 q.addLast((h-1,w)) fromS[h-1][w] = ((h,w)) if h+1 costS[h][w]+board[h+1][w]+1: costS[h+1][w] = costS[h][w]+board[h+1][w]+1 q.addLast((h+1,w)) fromS[h+1][w] = ((h,w)) if w-1>=0: if costS[h][w-1] > costS[h][w]+board[h][w-1]+1: costS[h][w-1] = costS[h][w]+board[h][w-1]+1 q.addLast((h,w-1)) fromS[h][w-1] = ((h,w)) if w+1 costS[h][w]+board[h][w+1]+1: costS[h][w+1] = costS[h][w]+board[h][w+1]+1 q.addLast((h,w+1)) fromS[h][w+1] = ((h,w)) q.addLast((n-1,n-1)) while q.len>0: var (h,w)=q.popFirst() if h-1>=0: if costG[h-1][w] > costG[h][w]+board[h-1][w]+1: costG[h-1][w] = costG[h][w]+board[h-1][w]+1 q.addLast((h-1,w)) fromG[h-1][w] = ((h,w)) if h+1 costG[h][w]+board[h+1][w]+1: costG[h+1][w] = costG[h][w]+board[h+1][w]+1 q.addLast((h+1,w)) fromG[h+1][w] = ((h,w)) if w-1>=0: if costG[h][w-1] > costG[h][w]+board[h][w-1]+1: costG[h][w-1] = costG[h][w]+board[h][w-1]+1 q.addLast((h,w-1)) fromG[h][w-1] = ((h,w)) if w+1 costG[h][w]+board[h][w+1]+1: costG[h][w+1] = costG[h][w]+board[h][w+1]+1 q.addLast((h,w+1)) fromG[h][w+1] = ((h,w)) result = costS[n-1][n-1] for h in 0..0: var (fh,fw) = fromS[h][w] (th,tw) = fromG[h][w] result.min=2+costS[fh][fw]+costG[th][tw] echo solve()