51.N皇后
这道题没有想象中那么难,难的点在于最后的结果是三维的,回溯函数的参数应该传入二维数组(表示棋盘),然后遍历row那一行的全部列,判断isValid,总体思想其实和前面做的题差不多。
class Solution {
private:
vector<vector<string>>result;
bool isValid(int row,int col,vector<string>&chessboard,int n)
{
for(int i=0;i<row;i++)
{
if(chessboard[i][col]=='Q')
return false;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
{
if(chessboard[i][j]=='Q')
return false;
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)
{
if(chessboard[i][j]=='Q')
return false;
}
return true;
}
void backtracking(int n,int row,vector<string>&chessboard)
{
if(row==n)
{result.push_back(chessboard);return;}
for(int col=0;col<n;col++)
{
if(isValid(row,col,chessboard,n))
{ chessboard[row][col]='Q';
backtracking(n,row+1,chessboard);
chessboard[row][col]='.';
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
result.clear();
vector<string>chessboard(n,string(n,'.'));
backtracking(n,0,chessboard);
return result;
}
};
37.解数独
oh my god,我看了这道题的思路居然能自己写出代码来了......但是我还是感觉如果自己写会卡在某个地方....先这样吧,这道题主要是两层for循环遍历,然后遇到'.'就开始填数字,填完一个数字查看isValid,如果是true的话就继续找下一个数,不断搜索,只要有一个组合填完(即整个棋棋盘没有'.',就返回true),那么就返回true;如果isValid是false,就找下一个数,如果全部数都没能符合要求,就返回false。
class Solution {
private:
bool backtracking(vector<vector<char>>& board) {
for(int i=0;i<board[0].size();i++)
{
for(int j=0;j<board.size();j++)
{
if(board[i][j]=='.')
{
for(int k='1';k<='9';k++)
{
if(isValid(i,j,k,board))
{
board[i][j]=k;
if(backtracking(board))
return true;
board[i][j]='.';
}
}
return false;
}
}
}
return true;
}
bool isValid(int row, int col, char val, vector<vector<char>>& board) {
for(int j=0;j<board[0].size();j++)
{
if(board[row][j]==val)
return false;
}
for(int i=0;i<board.size();i++)
{
if(board[i][col]==val)
return false;
}
int startRow=row/3*3;
int startCol=col/3*3;
for(int i=startRow;i<startRow+3;i++)
{
for(int j=startCol;j<startCol+3;j++)
{
if(board[i][j]==val)
return false;
}
}
return true;
}
public:
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};