- N-Queens N皇后问题,输出全部解
bool isvalid(int row,int col,int N,vector<int> &record)//判断是否能够放置
{
for(int i=0;i<N;i++)
{
if(record[i] == col || abs(i-row) == abs(record[i]-col))
return false;
}
return true;
}
void print(vector<vector<string>> &result,vector<int> &record,int N)//输出
{
ostringstream re;
vector<string> temp;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(record[i] == j)
re<<'Q';
else
re<<'.';
}
temp.push_back(re.str());
re.str("");
}
result.push_back(temp);
}
- 非递归的主体函数实现
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
int row=0,col=0;
vector<int> record(n,-10000);
while(row<n)
{
while(col<n)
{
if(isvalid(row,col,n,record))
{
record[row] = col;
col = 0;
break;
}
else
{
col++;
}
}
if(record[row] == -10000)//若这一行没有放置
{
if(row==0)//退到第一行,程序结束
break;
else
{
--row; //回退到上一行
col=record[row] +1;//上一行往右移一列
record[row] = -10000;//清除上一行的皇后
continue;
}
}
if(row == n-1)
{
print(result,record,n);
col = record[row]+1;//往右移一列
record[row] = -10000;//清除本行的皇后
continue;
}
++row;
}
return result;
}