藍橋杯—受傷的皇后(C語言解法)
阿新 • • 發佈:2022-03-29
題目描述
思路描述
- 因為有n個皇后,n*n個格子,所以每行都會有一個皇后,所以用一維陣列st儲存每位皇后所在的列(st下標表示第幾位皇后,也就是行數)
- 在正對角線上時,行列相減相等,在負對角線時,行列相加相等
- 確定每個皇后所在的列,通過檢視該位皇后與前一皇后所在列是否衝突確定
程式碼
#include<stdio.h> #include<math.h> int n; int res;//符合條件的結果數 int st[20]; int check(int r,int c){ int i; int t1,t2,t3,t4; for(i=1;i<r;i++){//看當前行的皇后位置與前一行是否衝突 t1=st[i]+i;//第i個皇后的行列之和相加 t2=st[i]-i; t3=r+c; t4=c-r; if(c==st[i] || (t1==t3 && abs(i-r)<3) || (t2==t4 && abs(i-r)<3))return 0; } return 1; } void dfs(int h){ int i; if(h>n){ res++; return; } for(i=1;i<=n;i++){//遍歷列 if(check(h,i)){ st[h]=i; dfs(h+1); } } } int main(){ scanf("%d",&n); dfs(1); printf("%d",res); return 0; }