地上有一个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
例 1:
输入:m = 3, n = 1, k = 0
输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20java
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof学习
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class G机器人的运动范围 { static int []dx= {1,0,-1,0}; static int []dy= {0,-1,0,1}; static Scanner in=new Scanner(System.in); static int m=0;static int n=0;static int k=0; static int vis[][]=new int[100][100];static int sum=1; static Queue<Integer>qx=new LinkedList<>(); static Queue<Integer>qy=new LinkedList<>(); static int [][]map=new int [100][100]; public static boolean inmap(int x,int y) { return(x>=0&&x<=m&&y>=0&&y<n); } public static int fj(int x) { int ans=0; while(x>0) { ans+=x%10; x/=10; } return ans; } public static void bfs(int x,int y,int k) { while(!qx.isEmpty()) { for(int i=0;i<4;i++) { int xx=qx.peek()+dx[i]; int yy=qy.peek()+dy[i]; if(inmap(xx,yy)&&vis[xx][yy]!=1&&fj(xx)+fj(yy)<=k) { sum++; vis[xx][yy]=1; qx.offer(xx); qy.offer(yy); } } qx.poll(); qy.poll(); } } public static void main(String[] args) { // TODO Auto-generated method stub m=in.nextInt();n=in.nextInt();k=in.nextInt(); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { map[i][j]=i+j; } } qx.offer(0); qy.offer(0); vis[0][0]=1; bfs(0,0,k); System.out.print(sum); } }
注意点:
1.sum初始化的时候应该等于1;由于坐标是从0,0开始的,即便k等于0;坐标数位之和也是知足>=k这一条件的;code