问题描述:
存在n*n的格子,往里放n个皇后(棋子),对每一个放入的棋子要求其同一行、同一列以及对角线不能存在其它的棋子。输出在数目为n的情况下所有的排列情况
问题解答:
1.主体函数如图所示,一共有n行,使用a这个数组记录此行的棋子摆在第几列,例如a[3]= 7的含义就是说第三行的棋子摆在第七列,从第一行开始摆棋子,如果check函数返回true表明这个位置可以摆放就标记a数组,递归进行下一行,知道第n+1行此时得到所有棋子位置,输出。在dfs返回后就清空a数组用于下一种排列方式使用。
void dfs(int row)
{
if(row == n+1)
{
cnt++;
for(int i = 1;i <= n; i++)
std::cout<<a[i]<<" ";
std::cout<<std::endl;
return;
}
for(int i = 1;i <= n;i++)
{
if(check(row,i))
{
a[row] = i;
dfs(row+1);
a[row] = 0;
}
}
}
2.check函数如图,作用是检查第row行的棋子能否放在第col列,故知前row-1行已经摆完了,而之后的行还没开始。故要检查这一列是否有棋子,以及左右对角线是否有棋子。注意左右对角线的检查方式。
bool check(int row,int col)
{
for(int i = 1;i < row; i++)
{
if(a[i] == col) return false;
if(i+a[i] == row + col) return false;
if(a[i]-i == col - row) return false;
}
return true;
}