离样例输出差1,跪求大佬调整
查看原帖
离样例输出差1,跪求大佬调整
1211502
TearsMeow楼主2024/7/26 02:40

跪求大佬调整orz

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

public class Main {
    static int N = 5,n,t;
    static int[][] g = new int[N][N];
    static int[] dx ={1,2,2,1,-1,-2,-2,-1},dy={-2,-1,1,2,2,1,-1,-2};
    static int[] opposite = {4,5,6,7,0,1,2,3};
    static int[][] ans ={
        {1,1,1,1,1},
        {0,1,1,1,1},
        {0,0,2,1,1},
        {0,0,0,0,1},
        {0,0,0,0,0},
    };
    static int Int(String s){return Integer.parseInt(s);}
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args)throws IOException{
        String[] arrStr = br.readLine().split(" ");
        t = Int(arrStr[0]);
        
        while(t -- > 0){
            for(int i =0;i < 5;i++){
                arrStr = br.readLine().split("");
                
                for(int j =0 ;j < 5;j++){
                    if("*".equals(arrStr[j]) ){
                        g[i][j] = 2;
                        continue;
                    }
                    g[i][j] = Int(arrStr[j]);
                    
                }
            }
            
            int depth = 0;
            while(depth <= 15 && !dfs(0,depth,-1)  ) depth++;
            if(depth > 15) pw.println(-1);
            else pw.println(depth);
            
        }
        pw.flush();br.close();pw.close();
    }
    static boolean dfs(int u,int maxDepth,int last){
        if(u + f() > maxDepth) return false;
        if(f() == 0) return true;
        int index = find();
        int x = index / 5;int y = index % 5;
        for(int i =0;i < 8;i++){
            int a = x + dx[i];int b =y + dy[i];
            if(opposite[i] == last) continue;
            if(a < 0 || a >= 5 || b < 0 || b >= 5) continue;
            operate(x,y,a,b);
            if(dfs(u + 1,maxDepth,i)) return true;
            operate(a,b,x,y);
        }
        return false;
    }
    static void operate(int a1,int a2,int b1,int b2){
        int t = g[a1][a2];
        g[a1][a2] = g[b1][b2];
        g[b1][b2] = t;
    }
    static int find(){
        int index  =0;
        for(int i = 0;i < 5;i++){
            for(int j =0;j < 5;j++){
                if(g[i][j]== 2) {
                    index = 5 * i + j;
                    break;
                }
            }
        }
        return index;
    }
    static int f(){
        int cnt = 0;
        for(int i = 0;i < 5;i++){
            for(int j =0;j < 5;j++){
                if(g[i][j] != ans[i][j]) cnt++ ;
            }
        }
        return cnt;
    }
    
}

2024/7/26 02:40
加载中...