这题有矩阵,又求最值,如果刷过类似的题,很容易想到bfs遍历。
bfs是用来求到达某一点的最短路径。这一题需要遍历所有可到达的节点,求出他们的最短路径,然后输出最长的一个值。
import java.util.*; public class Main{ private static int n; private static int m; private static int x0; private static int y0; public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ n=sc.nextInt(); m=sc.nextInt(); char[][] chars=new char[n][m]; for(int i=0;i<n;i++){ String strs=sc.next(); chars[i]=strs.toCharArray(); } x0=sc.nextInt(); y0=sc.nextInt(); int k=sc.nextInt(); int[][] steps=new int[k][2]; for(int i=0;i<k;i++){ steps[i][0]=sc.nextInt(); steps[i][1]=sc.nextInt(); } int ret=-1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ //起点需要排除,不然会影响最后的结果 if(i==x0&&j==y0) continue; if(chars[i][j]=='.'){ int max=bfs(i,j,chars,steps); //有无法到达的点,输出-1; if(max==-1){ System.out.println(-1); return; } //输出最大值 ret=Math.max(ret,max); } } } System.out.println(ret); //System.out.println(max-1); } } //bfs遍历的模板 public static int bfs(int ex,int ey,char[][] chars,int[][] steps){ boolean[][] marked=new boolean[n][m]; Queue<Node> queue=new LinkedList<>(); queue.add(new Node(x0,y0)); marked[x0][y0]=true; int max=0; while(!queue.isEmpty()){ int size=queue.size(); max++; while(size-- >0){ Node node=queue.poll(); int x=node.x; int y=node.y; marked[x][y]=true; for(int[] d:steps){ int nx=x+d[0]; int ny=y+d[1]; if(nx==ex&&ny==ey&&chars[nx][ny]=='.') return max; if(nx>n-1||nx<0||ny>m-1||ny<0||chars[nx][ny]=='X'||marked[nx][ny]) continue; queue.add(new Node(nx,ny)); } } } return -1; } } class Node{ int x; int y; public Node(int x,int y){ this.x=x; this.y=y; } }