题目

image.png

思路

  • 回溯老套路

    代码

    1. List<List<String>> res;
    2. List<String> list;
    3. int[][] visited;
    4. char[] arr;
    5. public List<List<String>> solveNQueens(int n) {
    6. res = new ArrayList<>();
    7. list = new ArrayList<>();
    8. visited = new int[n][n];
    9. arr = new char[n];
    10. for (int i = 0; i < n; i++) {
    11. arr[i] = '.';
    12. }
    13. dfs(n, 0);
    14. return res;
    15. }
    16. public void dfs(int n, int m) {
    17. if (m == n && list.size() < n) return;
    18. if (m == n && list.size() == n) {
    19. res.add(new ArrayList<>(list));
    20. return;
    21. }
    22. for (int i = 0; i < n; i++) {
    23. if (visited[m][i] > 0) continue;
    24. arr[i] = 'Q';
    25. //添加字符串
    26. list.add(new String(arr));
    27. arr[i] = '.';
    28. //设置不可访问位
    29. for (int j = m, l = i, r = i; j < n; j++, l--, r++) {
    30. visited[j][i]++;
    31. if (l >= 0) visited[j][l]++;
    32. if (r < n) visited[j][r]++;
    33. }
    34. dfs(n, m + 1);
    35. //撤销不可访问位
    36. for (int j = m, l = i, r = i; j < n; j++, l--, r++) {
    37. visited[j][i]--;
    38. if (l >= 0) visited[j][l]--;
    39. if (r < n) visited[j][r]--;
    40. }
    41. //移除字符串
    42. list.remove(list.size() - 1);
    43. }
    44. }

    N皇后