遇到的问题:one之前写了八皇后,对于n皇后的对角线问题一直有问题。但是仔细都列出来找了一下规律之后觉得其实蛮简单的。关键是对角线标记数组要开大一点,避免越界。 two都对了之后结果TLE,最后在帮助下打了个表,顺利通过啦。。
思路:行不需要标记,从0循环到n-1,一种方法的递归结束条件是行循环到了n-1,只要列标记和对角线标记。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int n;
int sum;
int r[15],d1[35],d2[35],a[11];//d1和d2数组分别是两个对角线数组,注意要开得大一些,题目只有到10,所以35差不多啦
void dfs(int k){
if(k==n){
sum++;
return ;
}
for(int i=0;i<n;i++){
if(!r[i]&&!d1[i+k]&&!d2[i-k+n-1]){
r[i]=1;
d1[i+k]=1;
d2[i-k+n-1]=1;
dfs(k+1);
r[i]=0;
d1[i+k]=0;
d2[i-k+n-1]=0;//对角线这个规律不是唯一的
}
}
}
int main(){
for(n=1;n<=10;n++){
memset(r,0,sizeof(r));
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
sum=0;
dfs(0);
a[n]=sum;
}//这步避免的TLE
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
cout<<a[n]<<endl;
}
return 0;
}