地上有一个 m 行和 n 列的方格。一个机器人从坐标 0,0 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 例如,当 k 为 18 时,机器人能够进入方格(35,37),因为 3+5+3+7 = 18 。但是,它不能进入方格(35,38),因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?
数据范围:
, 
一行三个正整数由空格分开,分别代表行数 m ,列数 n ,和坐标数位之和的阈值 k 。
一个正整数,代表该机器人能够到达的格子数量。
3 3 6
9
1 1 1
1
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] numStr = sc.nextLine().split(" "); int m = Integer.valueOf(numStr[0]); int n = Integer.valueOf(numStr[1]); int k = Integer.valueOf(numStr[2]); int[][] grid = new int[m][n]; int nums = dfs(grid, 0, 0, m, n, k); System.out.println(nums); } public static int dfs(int[][] grid, int row, int col, int m, int n, int k) { if (row < 0 || row >= m || col < 0 || col >= n) return 0; if (getSum(row) + getSum(col) > k || grid[row][col] == 1) return 0; grid[row][col] = 1; return 1 + dfs(grid, row - 1, col, m, n, k) + dfs(grid, row + 1, col, m, n, k) + dfs(grid, row, col - 1, m, n, k) + dfs(grid, row, col + 1, m, n, k); } public static int getSum(int point) { int sum = 0; while (point != 0) { sum += (point % 10); point /= 10; } return sum; } }
import java.util.*; public class Main{ private static int[][] step={{0,1},{-1,0},{0,-1},{1,0}}; private static int cnt=0; private static boolean isBigger(int r,int c,int k) { int res=0; while(r>0) { res+=r%10; r/=10; } while(c>0) { res+=c%10; c/=10; } if(res>k) return true; return false; } public static void backTrack(int i,int j,int k,int rows,int cols,boolean[][] mark){ if(i>=rows||i<0||j>=cols||j<0||mark[i][j]) return; mark[i][j]=true; if(isBigger(i,j,k)) return; cnt++; for(int[] n:step) backTrack(i+n[0],j+n[1],k,rows,cols,mark); } public static void main(String args[]){ Scanner scan=new Scanner(System.in); int m=scan.nextInt(); int n=scan.nextInt(); int k=scan.nextInt(); boolean[][] mark=new boolean[m][n]; backTrack(0,0,k,m,n,mark); System.out.println(cnt); } }