Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
class Solution {
bool canPut(int row, int list,int queens, int location[][100]){
int p = row, q = list;
for(int i = 0 ; i < row ; i++) //判断第row行皇后能否放在第list列
if(location[i][list]==1)
return false;
while((--p>=0)&&(--q>=0)) //判断第(row,list)皇后是否与左上角斜线皇后冲突
if(location[p][q]==1)
return false;
p = row;
q = list;
while((--p>=0)&&(++q<queens))//判断第(row,list)皇后是否与右上角斜线皇后冲突
if(location[p][q]==1)
return false;
return true;
}
void funcation(int row, int queens, int location[][100], int &total){
if(row>=queens) return;
for(int i = 0 ; i < queens ; i++){
if(canPut(row, i, queens, location)){ //判断该位置能否放置皇后
if(row==queens-1){ //最后一行只有一个位置能放置皇后,so判断能后直接返回即可
total++;
return;
}
location[row][i] = 1; //将皇后放在该列
funcation(row+1, queens, location, total); //进入下一个皇后位置判断
location[row][i] = 0; //将皇后位置还原
}
}
}
public:
int totalNQueens(int n) {
int total = 0 ;
int location[100][100];
memset(location, 0, sizeof(location));
funcation(0, n, location, total);
return total;
}
};