N皇后问题:回溯的经典代表性题目,设置数组temp[N],其中temp[i]代表棋盘i行象棋的所在列,即(i,temp[i])为i行的象棋坐标。回溯过程中,采用check函数判定当前位置(row,col)能否满足题目要求:各行各列各对角线上不同时存在多个象棋;
class Solution {
public:
bool check(vector<int>& temp, int row, int col)
{
for (int i = 0; i < temp.size(); i++)
{
if (row == i || col == temp[i] || abs((row - i)) == abs((col - temp[i])))
return 0;
}
return 1;
}
void find(vector<vector<int>>& res, vector<int>& temp, int row, int total)
{
if (row == total)
{
res.push_back(temp);
return;
}
int i = row;
for (int j = 0; j < total; j++)
{
if (check(temp,i,j))
{
temp.push_back(j);
find(res, temp, i + 1, total);
temp.pop_back();
}
}
}
int totalNQueens(int n) {
vector<int> temp;
vector<vector<int>> res;
find(res,temp,0,n);
return res.size();
}
};