看书学会了回溯法,交题时发现超时了,才发现该原来要进行预处理,减少计算量。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 11;
int a[maxn];
int n;
int sum = 0;
void search(int t)
{
if(t == n) sum++;
else{
for(int i = 0; i < n; i++){
int ok = 1;
a[t] = i;
for(int j = 0; j < t; j++){
if(a[t] == a[j] || t - a[t] == j - a[j] || t + a[t] == j + a[j]){
ok = 0; break;
}
}
if(ok)
search(t+1);
}
}
}
int main()
{
int ans[maxn];
for(int i = 1; i <= 10; i++){
n = i;
sum = 0;//全局变量,不需要返回值
search(0);
ans[i] = sum;
}
while(scanf("%d", &n) != EOF && n != 0){
cout << ans[n] <<endl;
}
return 0;
}