问题描述
在 n*n 的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后不能处于同一行、同一列或者同一斜线上。
遇到的问题:
双重循环内外层弄反了,如果先判断摆过的棋子,那么第一遍连循环都进不去。同样,dfs语句也要放在内层循环外部。应该先大致判断这一行能放在第几列,再来判断是否冲突。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<stdlib.h>
using namespace std;
int cnt=0;
int r[100]; //r[i]存放第i行所在列数
bool visit[100];
void dfs(int m,int n)
{
if(m==n)
{
// for(int i=0;i<n;i++)
// cout << r[i] <<" ";
// cout << endl;
cnt++;
return;
}
for(int j=0;j<n;j++)
{
if(!visit[j]) continue; //如果有皇后在这一列
bool flag = true;
for(int i=0;i<m;i++)
{
if(r[i]==j) continue; //如果在同一列
if(abs(m-i)==abs(r[i]-j))
{
flag = false;
break;
}
}
if(flag)
{
r[m] = j;
visit[j] = false;
dfs(m+1,n);
visit[j] = true;
}
}
}
int main()
{
int n;
while(cin >> n)
{
cnt=0;
memset(r,0,sizeof(r));
memset(visit,true,sizeof(visit));
dfs(0,n);
cout <<n<<"皇后问题共有" <<cnt <<"种情况"<< endl;
}
return 0;
}