马的遍历 Java版

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式

一行四个数据,棋盘的大小和马的坐标

输出格式

一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
**输入 **

3 3 1 1

输出

0    3    2    
3    -1   1    
2    1    4    

思路
一看就是BFS,不是很难但是这是我第一道BFS的题,所以纪念一下。 这题求马到达棋盘上任意一个点最少要走几步,一共八个方向,所以我们可以先定义出方向数组

public static int xx[]={
    
    2,1,-1,-2,-2,-1,1,2};
public static int yy[]={
    
    1,2,2,1,-1,-2,-2,-1};	

然后就是一系列套路Java中队列这么定义
Queue<Integer> x=new LinkedList<Integer>();网上看到的 ,此外要注意的点
1.走不到的点要为-1,我们可以在初始化的时候把全部的点都变为-1,这样我们最后,就不再找一遍;
2,我们这一步的步数,是上一步的步数加1得来的,c++使用结构体记录上一步的步长,我们Java定义一个记录步数的二维数组记录步长会比较便捷,a[i][j]表示马走到第i行j列的最小步数;
3.就是输出的时候System.out.printf("%-5d",a[i][j]);这样才能和题目输出的格式一样
最后上代码

   import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
    
    
	   public static int xx[]={
    
    2,1,-1,-2,-2,-1,1,2};
	    public static int yy[]={
    
    1,2,2,1,-1,-2,-2,-1};
	    public static int temp[][]=new int[405][405];
	    public static int step[][]=new int [405][405];
	    public static void main(String[] args) {
    
    
	        Scanner input=new Scanner(System.in);
	        int n=input.nextInt();
	        int m=input.nextInt();
	        int sx=input.nextInt();
	        int sy=input.nextInt();
	        int a[][]=new int[n+1][m+1];
	        
	        for(int i=0;i<n+1;i++){
    
    
	            for(int j=0;j<m+1;j++){
    
    
	                a[i][j]=-1;
	            }
	        }
	        bfs(sx,sy,a,n,m);
	        for(int i=1;i<n+1;i++){
    
    
	            for(int j=1;j<m+1;j++){
    
    
	               System.out.printf("%-5d",a[i][j]);
	            }
	            System.out.println();
	        }


	    }
	    public static void bfs(int sx,int sy,int a[][],int n,int m){
    
    
	        Queue<Integer> x=new LinkedList<Integer>();
	        Queue<Integer> y=new LinkedList<Integer>();
	        
	        x.offer(sx);
	        y.offer(sy);
	        //第一个点初始化为0
	        a[sx][sy]=0;
	        //用来标记哪些点已经走过,走过了就不走了
	        temp[sx][sy]=1;
	        while(!x.isEmpty()&&!y.isEmpty()){
    
    
	             int x2=x.poll();
	             int y2=y.poll();
	             for(int i=0;i<8;i++){
    
    
	            	  int x1=x2+xx[i];
	  	              int y1=y2+yy[i];
	                  if((x1>=1&&x1<=n&&y1>=1&&y1<=m)&&temp[x1][y1]==0){
    
    
	                    temp[x1][y1]=1;
	                    a[x1][y1]=a[x2][y2]+1;//由x2,y2向其他八个方向走,一次上一步就是a[x2][y2];
	                    
	                    x.offer(x1);
	                    y.offer(y1);
	                }
	         }
	       }
          } 
   	    }

猜你喜欢

转载自blog.csdn.net/qq_44844588/article/details/107346090