度小满0920

多组数据,第1行有1个正整数T,表示有T组数据。(T<=100)

对于每组数据,第1行有两个整数N和M。(1<=N, M<=1000)

接着N行,每行有一个长度为M的字符串,表示N*M的迷宫。
输出一个整数,表示使用特异功能的最少次数。如果小昆虫不能走出迷宫,则输出-1。
假设小昆虫在一个N*M的迷宫中,"@"代表小昆虫的初始位置,"."代表可以通过的空地,"*"代表可以破坏的障碍物,
"#"代表不可破坏的障碍物。请问小昆虫最少需要使用多少次特异功能才可以逃出迷宫?
3
3 3
###
#@*
***
3 4
####
#@.*
**.*
3 3
.#.
#@#
.#.
public class Main02 {
    public static int[] findStartPos(char[][] grid, int n, int m) {
        for(int i=0; i < n; i++) {
            for(int j=0; j < m; j++) {
                if(grid[i][j] == '@')
                    return new int[]{i,j};
            }
        }
        return new int[] {};
    }
    static int[] dx = new int[] {0,0,1,-1};
    static int[] dy = new int[] {1,-1,0,0};
    static boolean[][] used ;
    static int result ;
    public static void solve(char[][] grid, int n, int m, int x, int y, int res) {
        if(x < 0 || x >= n || y < 0 || y >= m) {
            //System.out.println(Arrays.deepToString(used));
            result = Math.min(res, result);
            return ;
        }
        if(grid[x][y] == '#' || used[x][y] == true) return ;
        if(grid[x][y] == '*') res++;
        used[x][y] = true;
        for(int i=0; i < 4; i++) {
            int xx = x + dx[i], yy = y + dy[i];
            solve(grid, n, m, xx, yy, res);
        }
        used[x][y] = false;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int times = sc.nextInt();
        while(times-- > 0) {
            int n = sc.nextInt(), m = sc.nextInt();
            char[][] grid = new char[n][m];
            for(int i=0; i < n; i++)
                grid[i] = sc.next().toCharArray();
            int[] xy = findStartPos(grid, n,m);
            used = new boolean[n][m];
            result = Integer.MAX_VALUE;
            int x= xy[0], y = xy[1];
            solve(grid,n,m,x,y,0);
            if(result == Integer.MAX_VALUE) {
                System.out.println(-1);
            }else{
                System.out.println(result);
            }
        }
    }

}

回溯一定别忘了跳出循环!!!!!!!!!!!!!!!!!!!!!

public class Main01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] a = sc.next().toCharArray();
        char[] b = sc.next().toCharArray();
        int[] cntA = new int[26];
        int[] cntB = new int[26];
        for(int i=0; i < a.length; i++)
            cntA[a[i]-'A'] ++;
        for(int i=0; i < b.length; i++)
            cntB[b[i]-'A'] ++;
        //System.out.println(Arrays.toString(cntA));
        int res = 0;
        for(int i=0; i < 26; i++)
            res += Math.min(cntA[i],cntB[i]);
        System.out.println(res);
    }
}
posted @ 2020-09-20 22:31  li修远  阅读(119)  评论(0编辑  收藏  举报