中级农民
- 积分
- 121
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-10-23
- 最后登录
- 1970-1-1
|
皇后2,好蠢
- class Solution {
- int[] X = new int[]{-1, 1, 0, 0, -1, -1, 1, 1};
- int[] Y = new int[]{0, 0, -1, 1, -1, 1, -1, 1};
- int res = 0;
- List<List<String>> result = new ArrayList<>();
- public int totalNQueens(int n) {
- boolean[][] grid = new boolean[n][n];
- helper(grid, n, 0, 0, new ArrayList<>());
- return res;
- }
- private void helper(boolean[][] grid, int k, int mStart, int nStart, List<String> list) {
- if (k == 0) {
- result.add(new ArrayList<>(list));
- res = res + 1;
- return;
- }
- // for every possible grid, try this!
- for (int m = mStart; m < grid.length; m++) {
- for (int n = nStart; n < grid.length; n++) {
- if (grid[m][n] == false) {
- boolean[][] tmp = new boolean[grid.length][grid.length];
- for (int i = 0; i < grid.length; i++) {
- for (int j = 0; j < grid.length; j++) {
- tmp[i][j] = grid[i][j];
- }
- }
- sink(grid, m, n);
- list.add(m + "," + n);
- helper(grid, k - 1, m, 0, list);
- list.remove(list.size() - 1);
- for (int i = 0; i < grid.length; i++) {
- for (int j = 0; j < grid.length; j++) {
- grid[i][j] = tmp[i][j];
- }
- }
- // unSink(grid, m, n);
- }
- }
- }
- }
- //mark all the places as dot
- private boolean[][] sink(boolean[][] grid, int i, int j) {
- grid[i][j] = true;
- for (int dir = 0; dir < 8; dir++) {
- int x = i + X[dir];
- int y = j + Y[dir];
- while (x >= 0 && x < grid.length && y >= 0 && y < grid.length) {
- grid[x][y] = true;
- x += X[dir];
- y += Y[dir];
- }
- }
- return grid;
- }
- //mark all the places as dot
- private boolean[][] unSink(boolean[][] grid, int i, int j) {
- grid[i][j] = false;
- for (int dir = 0; dir < 8; dir++) {
- int x = i + X[dir];
- int y = j + Y[dir];
- while (x >= 0 && x < grid.length && y >= 0 && y < grid.length) {
- grid[x][y] = false;
- x += X[dir];
- y += Y[dir];
- }
- }
- return grid;
- }
- }
复制代码
|
|