输入:一个整数代表n*n方阵
输出:一个整数,代表有多少种情况
代码:
#include <iostream>
#include<cstdlib>
using namespace std;
const int MAXN=20;
int result[MAXN]={0};//result[i]代表第i行的皇后所在的列。
int used[MAXN]={0};//used[i]用来存第i列是否有皇后已经放置了。
int sum=0;
int mysize=0;
void dfs(int count){//第count行皇后的判断
if(count==mysize){//首先判断是否符合一种情况,如果符合就输出。
for(int i=0;i<mysize;i++){
printf("%d",result[i]);
}
printf("\n");
sum++;
}
for(int i=0;i<mysize;i++){//做选择,判断哪一列还可以放皇后
if(used[i]==0){
bool flag=true;
for(int j=0;j<count;j++){
if(abs(i+1-result[j])==abs(j-count))//行减行的绝对值等于列减列的绝对值相等的话,意味着它们属于同一条斜对角线上。
{flag=false;
break;
}
}
if(flag==true){
used[i]=1;
result[count]=i+1;//如果符合就加入到结果中
dfs(count+1);//进行递归
used[i]=0;//递归过后恢复状态
}
}
}
}
int main()
{scanf("%d",&mysize);
dfs(0);
printf("一共有%d种情况",sum);
return 0;
}
2601

被折叠的 条评论
为什么被折叠?



