Edición Java de Horse Traversal

Descripción del Título

Hay un tablero de ajedrez de n * m (1 <n, m <= 400), hay un caballo en un punto determinado, y debes calcular el número mínimo de pasos que debe dar el caballo para llegar a cualquier punto del tablero de ajedrez.
Formato de entrada

Cuatro datos en una fila, el tamaño del tablero de ajedrez y las coordenadas del caballo

Formato de salida

Una matriz n * m, lo que significa que el caballo tiene que caminar al menos unos pocos pasos para llegar a cierto punto (alineado a la izquierda, 5 cuadrículas de ancho, salida -1 si no puede llegar)
Ejemplo de entrada y salida
** Entrada **

3 3 1 1

Salida

0    3    2    
3    -1   1    
2    1    4    

Ideas
A primera vista, BFS no es difícil, pero esta es mi primera pregunta sobre BFS, así que recuérdala. Esta pregunta requiere un 马到达棋盘上任意一个点最少要走几步total de ocho direcciones, por lo que primero podemos definir la matriz de dirección de salida

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

Luego hay una serie de rutinas en Java. La cola se define como se
Queue<Integer> x=new LinkedList<Integer>();ve en Internet . Además, puntos
a anotar. 1. El punto que no se puede alcanzar es -1que podemos cambiar todos los puntos durante la inicialización -1, para que finalmente no Encuéntrelo de nuevo;
2. El número de pasos en este paso es el número de pasos en el paso anterior más 1. C ++ usa la estructura para registrar la longitud del paso del paso anterior. Definimos una matriz bidimensional para registrar el número de pasos para registrar la longitud del paso en Java. Será más conveniente, lo que a[i][j]significa el número mínimo de pasos para que el caballo camine hasta la i-ésima fila y la j-ésima columna;
3. Es el System.out.printf("%-5d",a[i][j]);formato de salida para que pueda ser el mismo que el formato de salida del título.
Finalmente, el código

   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);
	                }
	         }
	       }
          } 
   	    }

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/107346090
Recomendado
Clasificación