1. 程式人生 > 其它 >藍橋杯—受傷的皇后(C語言解法)

藍橋杯—受傷的皇后(C語言解法)

題目描述

點選檢視原題

思路描述

  1. 因為有n個皇后,n*n個格子,所以每行都會有一個皇后,所以用一維陣列st儲存每位皇后所在的列(st下標表示第幾位皇后,也就是行數)
  2. 在正對角線上時,行列相減相等,在負對角線時,行列相加相等
  3. 確定每個皇后所在的列,通過檢視該位皇后與前一皇后所在列是否衝突確定

程式碼

#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;
}