解题报告:N皇后问题
n皇后问题
Time Limit: 1 Second(s) Memory Limit: 32 MB
Total Submission(s): 127 Accepted Submission(s): 54
Total Submission(s): 127 Accepted Submission(s): 54
Problem Description
在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。Input
每个测试数据为棋盘的大小n。(n<12)
Output
输出满足要求的方案个数。
Sample Input
1 2 3Sample Output
1 0 0本题我使用回溯法:
入皇后步骤为:
putqueen(row)
for 同一行上的每个位置
if 该位置可以放皇后
将下一个皇后放在该位置
if(未到最后一行)
putqueen(row+1)
else 成功;
取走该位置皇后
具体请看代码:
#include <iostream>
using namespace std;
int p[12][12];//初始化棋盘(棋盘太大回溯法的效率很低,所以该题的数据很小)
int result;
int n;//棋盘大小
void init(int n)//初始化棋盘
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
p[i][j]=0;
}
result=0;
}
bool issafe(int row,int col)//判断该位置能否放皇后
{
for(int i=0;i<row;i++)
{
for(int j=0;j<n;j++)
{
if(p[i][j]==1)
{
//判断同行,同列,对角线上是否有皇后
if(i==row||j==col||(j-i)==(col-row)||(j+i)==(col+row))
return false;
}
}
}
return true;
}
void putqueen(int x)//入皇后
{
for(int y=0;y<n;y++)//遍历该行每个位置
{
if(issafe(x,y))//如果安全
{
p[x][y]=1;//则放皇后
if(x<n-1)
putqueen(x+1);//如果未到最后一行,在下一行放皇后
else
result++;//否则返回,结果加1
}
{
for(int k=0;k<n;k++)//该步骤很重要,拿走该行上的皇后
p[x][k]=0;
}
}
}

int main()
{
while(cin>>n)
{
init(n);
putqueen(0);
cout<<result<<endl;
}
return 0;
}



浙公网安备 33010602011771号