标签:
#include<stdio.h>
#include<string.h>
int n,tmp;
int map[11];//记录皇后列标
void queen(int x)
{
int i,j,flag;
if(x==n+1)
{
tmp++;
return;
}
else
{
for(i=1;i<=n;++i)//列标
{
map[x]=i;
flag=1;
for(j=1;j<x;++j)//行标x,列标j
{
if(map[j]==i||i-x==map[j]-j||i+x==map[j]+j) // 注:1、i=map[x] 判断是否之前有皇后(map[j])占用该列 2、不在同一条斜线的两点的含义是行标到对角线的的距离不相等
{
flag=0;
break;
}
}
if(flag)
queen(x+1);//下一层
}
}
}
int main()
{
int m;
int ans[11];
for(n=1;n<=10;++n)
{
tmp=0;
queen(1);//从第一层搜索
ans[n]=tmp;
}
while(scanf("%d",&m),m)
{
printf("%d\n",ans[m]);
}
return 0;
}
深搜+回溯,但是a不过去,超时了,不过容易理解
代码:
#include <iostream>
#include<string.h>
using namespace std;
bool map[15][15];
int sum;
int n;
bool place(int x,int y){
for(int i = 1;i <= n;i++){
if(map[x][i] == true || map[i][y] == true)
return false;
//左上角
if(x-i >= 1 && y - i >= 1 &&map[x-i][y-i] == true)
return false;
//右上角
if(x-i >= 1 && y + i <= n &&map[x-i][y+i] == true)
return false;
//左下角
if(x+i <= n && y - i >= 1 &&map[x+i][y-i] == true)
return false;
//右下角
if(x+i <= n && y + i <= n &&map[x+i][y+i] == true)
return false;
}
return true;
}
void queen(int x){
if(x > n && n > 0){
sum ++;
x = 0;
}
else{
for(int i = 1;i <= n;i++){
if(place(x,i)){
map[x][i] = true;
queen(x+1);
map[x][i] = false;
}
}
}
}
int main()
{
while(cin >> n){
sum = 0;
if(n == 0)
break;
queen(1);
cout << sum << endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5424482.html