马的遍历(洛谷)JAVA

该问题描述了一个在n×m的棋盘上,使用类似象棋中的马的移动方式,计算从特定起点到任意点的最少步数。解决方案是通过广度优先遍历(BFS)算法,以起点开始,按照马的移动规则(日字形)扩展到相邻的未访问过的位置,直到遍历整个棋盘。对于无法到达的点,则标记为-1。提供的Java代码实现了这一算法。
摘要由CSDN通过智能技术生成

题目描述

有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n,m,x,y。

输出格式

一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 -1)。

输入输出样例

输入 #1

3 3 1 1

输出 #1 

0    3    2    
3    -1   1    
2    1    4    

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤x≤n≤40,1≤y≤m≤400。

解题思路:本题的马和象棋里的走法相似,按‘日’来走,所以画图分析的话有八种走法,由于要输出到每个位置的步数,这就需要广度优先遍历来地"毯式查找"。最后对不能到达的点标记为-1。

理论成立代码如下:

import java.util.*; 
public class Main {
    public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int m = sc.nextInt();
    solution s = new solution(n, m);
    s.starx = sc.nextInt();
    s.stary = sc.nextInt();
    s.bfs();
    s.print();
    }
}
class solution
{
 int a[][];//地图
 int M;
 int N;//边界
 int starx,stary;//起始点
 int fx[],fy[];//探索规则
 solution(int m, int n)
 {
   a = new int[m + 1][n + 1];//本题起点(1,1)
   M = m;
   N = n;
   int x[] = {2, -2, -2, 2, 1, -1, -1, 1};
   int y[] = {1, -1, 1, -1, 2, 2, -2, -2};//八个方向
   fx = x;
   fy = y;
 }
 public void bfs()
 {
   bfs(starx, stary);	 
 }
 private void bfs(int xx, int yy)
 {
   Queue<Integer> qux = new LinkedList<>();
   Queue<Integer> quy = new LinkedList<>();//储存坐标
   qux.offer(xx);
   quy.offer(yy);
   int fxx,fyy;
   while(!qux.isEmpty())
   { 
	 xx = qux.poll();
	 yy = quy.poll();
	 for(int i = 0;i < 8;i++)
	 {
	   fxx = xx + fx[i];
	   fyy = yy + fy[i];//新遍历方向
	   if(fxx > 0 && fxx <= M && fyy > 0 && fyy <= N && a[fxx][fyy] == 0 && !(fxx == starx && fyy == stary ))
	   {//新点要求没有被遍历过,且不是起点
		 a[fxx][fyy] = a[xx][yy] + 1;//新点+1
		 qux.offer(fxx);
		 quy.offer(fyy);//存入
	   }
	 }
   }
 }
 public void print()
 {
   for(int i = 1;i <= M;i++)
   {
	 for(int j = 1;j <= N;j++)
	 {
	   if(!(i == starx && j == stary) && a[i][j] == 0)
		 a[i][j] = -1;//没有遍历的点就是不能到达的点
	   System.out.print(a[i][j] + "    ");//输出,注意要跟四个空格
	 }
	 System.out.println();
   }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值