题目描述
在N×N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意22个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成4545角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法测试数据由多组测试样例组成。每组测试数据第一行输入一个正整数 n(1≤n≤10)
输出有多少种合法的放置方法
输入:
1
5
输出:
1
10
主要问题:
1:遍历各个点
2:判断是否能放
观察上图发现以2,2为中心斜角线遵循着 x1+y1==x2+y2 || x1-y1==x2-y2;
再用一维数组存x保证x不相同然后只要判y是否相同
bool check(int x,int y){
for(int i=1;i<x;i++){
if(zuo[i]==y || zuo[i]+i == x+y || zuo[i]-i==y-x)return false;
}
return true;
}
dfs递归全局ant存储答案
当遍历到n+1说明有一种答案
记得回溯
void dfs(int x){
if(x==n+1){
ant++;
return ;
}
for(int i=1;i<=n;i++){
if(check(x,i)){
zuo[x]=i;
dfs(x+1);
zuo[x]=0;
}
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
int mp[15][15];
int zuo[15];
int n;
int ant;
bool check(int x,int y){
for(int i=1;i<x;i++){
if(zuo[i]==y || zuo[i]+i == x+y || zuo[i]-i==y-x)return false;
}
return true;
}
void dfs(int x){
if(x==n+1){
ant++;
return ;
}
for(int i=1;i<=n;i++){
if(check(x,i)){
zuo[x]=i;
dfs(x+1);
zuo[x]=0;
}
}
}
int main(){
while(cin>>n){
ant=0;
dfs(1);
cout<<ant<<endl;
}
return 0;
}