1 8 5 0
1 92 10
经典回溯法。
求对角线的方法。 x-y求主对角线 x+y求副对角线
(1,0)(0,1)x+y都相等 (2,0)(1,1)(0,2)x+y相等,所以都处于副对角线 (0,0)(1,1)(2,2)。。(n,n)x-y相等 (0,1)(1,2)(2,3)。。x-y相等 所以位于主对角线
x-c[x]==j-c[j] 判断主对角线 x+c[x]==j+c[j] 判断副对角线。
此题打表。。否则超时。
#include<stdio.h> #include<algorithm> using namespace std; int tot; int n; int c[15]; int f[15]; void search(int x) { if(x==n) tot++; else { for(int i=0;i<n;i++) { int ok=1; c[x]=i; for(int j=0;j<x;j++) { if(c[x]==c[j]||x-c[x]==j-c[j]||x+c[x]==j+c[j]) { ok=0; break; } } if(ok) search(x+1); } } } void solve() { for(int i=1;i<11;i++) { tot=0; n=i; search(0); f[i]=tot; } } int main() { solve(); int num; while(scanf("%d",&num),num) { printf("%d\n",f[num]); } return 0; }