解题思路: 思路其实就是上下左右走,然后记录好路径就行了

注意事项:

参考代码:

private static boolean v[][];
    //这个是目标靶子数据
    private static int     l[][];
    //这个运行时候的靶子数据
    private static int     t[][];
    //控制方向
    private static int dif[][] = {{0,-1},{0,1},{-1,0},{1,0}};
    //记录路径
    private static int[][] walk;
    private static int n;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        v = new boolean[n][n];
        l = new int[2][n];
        t = new int[2][n];
        walk = new int[n][n];
        for (int i = 0; i < n; i++) {
            Arrays.fill(walk[i],-1);
        }
        //北边的靶子数
        for (int i = 0; i < n; i++) {
            l[0][i] = scanner.nextInt();
        }
        //西边的靶子数
        for (int i = 0; i < n; i++) {
            l[1][i] = scanner.nextInt();
        }
        dfs(0,0,0);
    }
    public static void dfs(int row,int col,int count){
        if (row < 0 || col < 0 ||row >= v.length || col >= v[0].length) return;
        if (v[row][col]) return;
        for (int k = 0; k < dif.length; k++) {
            v[row][col] = true;
            t[0][col] += 1;
            t[1][row] += 1;
            walk[row][col] = count++;
            if (row == n-1 && col == n-1) {
                boolean op = true;
                for (int i = 0; i < l.length; i++) {
                    for (int j = 0; j < l[i].length; j++) {
                        if (l[i][j] != t[i][j]) op = false;
                    }
                }
                if (op){
                    int cou = 0;
                    String pr = new String();
                    for (int i = 0; i < n; i++) {
                        for (int j = 0; j < n; j++) {
                            if (walk[i][j] == cou){
                                pr += i*n+j+" ";
                                i = 0;j =0 ;
                                cou++;
                            }
                        }
                    }
                    System.out.println(pr.substring(0,pr.length()-1));
                    return;
                }
            }
            
            dfs(row+dif[k][0],col+dif[k][1],count);
            v[row][col] = false;
            t[0][col] -= 1;
            t[1][row] -= 1;
            walk[row][col] = -1;
            count--;
        }
    }


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论