解题思路:

注意事项:

参考代码:

package 练习;

import java.util.*;

public class Main {
	static Scanner sc = new Scanner(System.in);
	static int n = sc.nextInt();
	static int count = 0;
	static ArrayList<Integer> ans = new ArrayList<>();

	public static void main(String[] args) {
		// int[] north ={2,4,3,4};
		// int[] west = {4,3,3,3};
		int[] north = new int[n];
		int[] west = new int[n];
		for (int i = 0; i < north.length; i++) {
			north[i] = sc.nextInt();
		}
		for (int i = 0; i < west.length; i++) {
			west[i] = sc.nextInt();
		}
		int[][] map = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				map[i][j] = count++;
			}
		}
		dfs(map, 0, 0, north, west);

	}

	private static void dfs(int[][] map, int x, int y, int[] north, int[] west) {
		boolean check = true;
		if (x >= n || y >= n || x < 0 || y < 0) {
			return;
		}
		for (int i = 0; i < n - 1; i++) {
			if (north[i] != 0 || west[i] != 0) {
				check = false;
			}
		}
		if (north[n - 1] != 1 || west[n - 1] != 1) {
			check = false;
		}
		for (int i = 0; i < n; i++) {
			if (north[i] < 0 || west[i] < 0) {
				return;
			}
		}
		if (x == n - 1 && y == n - 1 && check == false) {
			return;
		}

		if (x == n - 1 && y == n - 1 && check) {
			ans.add(map[x][y]);
			for (int i = 0; i < ans.size(); i++) {
				System.out.print(ans.get(i) + " ");
			}
			System.exit(0);
		}
		west[x]--;
		north[y]--;
		ans.add(map[x][y]);
		dfs(map, x, y + 1, north, west);
		dfs(map, x + 1, y, north, west);
		dfs(map, x - 1, y, north, west);
		dfs(map, x, y - 1, north, west);
		ans.remove(ans.size()-1);
		west[x]++;
		north[y]++;
	}
}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 1 条评论

一块蒸蛋糕 2年前 回复TA
发现了, 没有检查已走过的路径