package main import ( "fmt" ) type State struct { i, j int r int // 当前计数器 mod (p-1) steps int } func main() { var n, m, p int fmt.Scanf("%d %d %d", &n, &m, &p) // 读取 a[i][j] a := make([][]int, n) for i := 0; i < n; i++ { a[i] = make([]int, m) for j := 0; j < m; j++ { fmt.Scanf("%d", &a[i][j]) } } // 读取 b[i][j],但不需要使用 var tmp int for i := 0; i < n; i++ { for j := 0; j < m; j++ { fmt.Scanf("%d", &tmp) } } mod := p - 1 if mod == 0{ fmt.Println(-1) return } // dist[i][j][r] 表示到达 (i,j) 且余数为 r 的最小步数 dist := make([][][]int, n) for i:=0;i<n;i++{ dist[i]= make([][]int, m) for j:=0;j<m;j++{ dist[i][j] = make([]int, mod) for k:=0;k<mod;k++{ dist[i][j][k] = -1 } } } direction := [][]int{{1,0},{0,-1},{-1,0},{0,1}} queue := []State{} startR := a[0][0] % mod dist[0][0][startR] = 0 queue = append(queue, State{0,0,startR,0}) for len(queue) > 0{ cur := queue[0] queue = queue[1:] if cur.i == n-1 && cur.j == m-1 && cur.r == 0{ fmt.Println(cur.steps) return } // 四个方向 for _, v := range direction { ni, nj := cur.i + v[0], cur.j+v[1] if ni < 0 || ni >=n || nj<0 || nj>=m { continue } newR := (cur.r + a[ni][nj])%mod if dist[ni][nj][newR] == -1{ dist[ni][nj][newR] = cur.steps +1 queue = append(queue, State{ni,nj,newR,cur.steps + 1}) } } } fmt.Println(-1) }