马的遍历 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);
	                }
	         }
	       }
          } 
   	    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值