題目:
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
題解:
這道題跟NQueens的解法完全一樣(具體解法參照N QueensN Queens leetcode java),只不過要求的返回值不同了。。所以要記錄的result稍微改一下就好了。。。
因為涉及到遞歸,result傳進去引用類型(List,數組之類的)才能在層層遞歸中得以保存,所以這里使用一個長度為1的數組幫助計數。
當然,也可以使用一個全局變量來幫助計數。
代碼如下:
1
public
int totalNQueens(
int n) {
2 int[] res = {0};
3 if(n<=0)
4 return res[0];
5
6 int [] columnVal = new int[n];
7
8 DFS_helper(n,res,0,columnVal);
9 return res[0];
10 }
11
12 public void DFS_helper( int nQueens, int[] res, int row, int[] columnVal){
13 if(row == nQueens){
14 res[0] += 1;
15 } else{
16 for( int i = 0; i < nQueens; i++){
17 columnVal[row] = i; // (row,columnVal[row)==>(row,i)
18
19 if(isValid(row,columnVal))
20 DFS_helper(nQueens, res, row+1, columnVal);
21 }
22 }
23 }
24
25 public boolean isValid( int row, int [] columnVal){
26 for( int i = 0; i < row; i++){
27 if(columnVal[row] == columnVal[i]
28 ||Math.abs(columnVal[row]-columnVal[i]) == row-i)
29 return false;
30 }
31 return true;
2 int[] res = {0};
3 if(n<=0)
4 return res[0];
5
6 int [] columnVal = new int[n];
7
8 DFS_helper(n,res,0,columnVal);
9 return res[0];
10 }
11
12 public void DFS_helper( int nQueens, int[] res, int row, int[] columnVal){
13 if(row == nQueens){
14 res[0] += 1;
15 } else{
16 for( int i = 0; i < nQueens; i++){
17 columnVal[row] = i; // (row,columnVal[row)==>(row,i)
18
19 if(isValid(row,columnVal))
20 DFS_helper(nQueens, res, row+1, columnVal);
21 }
22 }
23 }
24
25 public boolean isValid( int row, int [] columnVal){
26 for( int i = 0; i < row; i++){
27 if(columnVal[row] == columnVal[i]
28 ||Math.abs(columnVal[row]-columnVal[i]) == row-i)
29 return false;
30 }
31 return true;
使用全局變量來記錄結果的代碼是:
1
int res;
2 public int totalNQueens( int n) {
3 res = 0;
4 if(n<=0)
5 return res;
6
7 int [] columnVal = new int[n];
8
9 DFS_helper(n,0,columnVal);
10 return res;
11 }
12
13 public void DFS_helper( int nQueens, int row, int[] columnVal){
14 if(row == nQueens){
15 res += 1;
16 } else{
17 for( int i = 0; i < nQueens; i++){
18 columnVal[row] = i; // (row,columnVal[row)==>(row,i)
19
20 if(isValid(row,columnVal))
21 DFS_helper(nQueens, row+1, columnVal);
22 }
23 }
24 }
25
26 public boolean isValid( int row, int [] columnVal){
27 for( int i = 0; i < row; i++){
28 if(columnVal[row] == columnVal[i]
29 ||Math.abs(columnVal[row]-columnVal[i]) == row-i)
30 return false;
31 }
32 return true;
33 }
2 public int totalNQueens( int n) {
3 res = 0;
4 if(n<=0)
5 return res;
6
7 int [] columnVal = new int[n];
8
9 DFS_helper(n,0,columnVal);
10 return res;
11 }
12
13 public void DFS_helper( int nQueens, int row, int[] columnVal){
14 if(row == nQueens){
15 res += 1;
16 } else{
17 for( int i = 0; i < nQueens; i++){
18 columnVal[row] = i; // (row,columnVal[row)==>(row,i)
19
20 if(isValid(row,columnVal))
21 DFS_helper(nQueens, row+1, columnVal);
22 }
23 }
24 }
25
26 public boolean isValid( int row, int [] columnVal){
27 for( int i = 0; i < row; i++){
28 if(columnVal[row] == columnVal[i]
29 ||Math.abs(columnVal[row]-columnVal[i]) == row-i)
30 return false;
31 }
32 return true;
33 }