Knight Geeks的步骤

时间:2019-06-02 05:09:54

标签: java algorithm data-structures dynamic-programming backtracking

我正在尝试解决Knight在Geeks4Geeks上的步骤,但在以下输入中我得到了WA 20 5 7 15 20 正确的答案是9我要398。请帮助

问题:

给出N×N大小的方形棋盘,给出骑士的位置和目标的位置。我们需要找出骑士到达目标位置所需的最低限度步骤。

输入: 输入的第一行包含一个整数T,它表示测试用例的数量。然后是T测试用例。每个测试用例都包含一个整数n,该整数n表示方形棋盘的大小。下一行包含骑士的X-Y坐标。下一行包含目标的X-Y坐标。

输出: 打印骑士到达目标位置所需的最小步幅。

我的解决方案:

import java.util.*;
import java.lang.*;
import java.io.*;

public class GFG {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t =sc.nextInt();
        while(t-->0){
            int n = sc.nextInt();
            int kx = sc.nextInt();
            int ky = sc.nextInt();
            int tx = sc.nextInt();
            int ty = sc.nextInt();

            int dx[] = {-2, -1, 1, 2, -2, -1, 1, 2};
            int dy[] = {-1, -2, -2, -1, 1, 2, 2, 1};
            boolean[][] visited = new boolean[n+1][n+1];
            System.out.println(sbk(kx,ky,tx,ty,0,visited,0,dx,dy,n));
        }
    }

    private static int sbk(int kx, int ky, int tx, int ty, int j, boolean[][] visited, int count, int[] dx, int[] dy,int n) {
        if(!isValid(kx,ky,n))
            return Integer.MAX_VALUE;
        if(visited[kx][ky])
            return Integer.MAX_VALUE;
        if(kx==tx && ky==ty)
            return count;
        visited[kx][ky] = true;
        int min = Integer.MAX_VALUE;
        for(int i=0;i<=7;i++){
            int res = sbk(kx+dx[i],ky+dy[i],tx,ty,0,visited,count+1,dx,dy,n);
            if(res<min)
                min=res;
        }
        return min;
    }

    private static boolean isValid(int kx, int ky,int n) {
        if(kx>n || kx<0 || ky>n || ky<0)
            return false;
        return true;
    }
}

0 个答案:

没有答案