每日算法-03機器人的運動範圍

今天不學習,明天我就是垃圾了,不要!!!!

地上有一個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

相關文章
相關標籤/搜索