C語言筆記--四皇后
阿新 • • 發佈:2018-11-17
四皇后是八皇后的衍生版本,其原理都是一樣的。八皇后說的是在8×8的國際棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法?八皇后一共有92種解法。而四皇后是在一個4×4的棋盤上擺放4個皇后。
分析:
1.皇后是每行放置一個,所以每行是不會發生衝突的
2.判斷位置是否安全依賴於該位置的列、副對角線、主對角線
3.如果遍歷所有列數都找不到合適位置,即說明上一個皇后需要重新放置
關係如下:
#include<stdio.h> #include<stdlib.h> #define M 4 int queue[M] = { -1 };//用來儲存4個皇后的列數 int count = 0;//方法總數 int issafe(int row, int column)//用於判斷該位置是否安全 { for (int i = 0; i<row; i++)//遍歷前面放置了皇后的行 { if (queue[i] == column)return 0;//同一列不安全 if ((row - i) == (column - queue[i]))return 0;//同一主對角線,行之差和列之差相等 if ((row - i) + (column - queue[i])==0)return 0;//副對角線,行之差列之差的和為0 } return 1; } void pickqueue(int num) { for (int i = 0; i<M; i++)//遍歷所有列數,找出能放的列 { if (issafe(num, i))//判斷當前皇后放在哪列式安全的 { queue[num] = i;//儲存當前列數 if (num == 3)//滿4個皇后 { count++; for (int j = 0; j < M; j++) { printf("%3d", queue[j]); } printf("\n"); } int next = num + 1; pickqueue(next);//下一個皇后 } } //遍歷完所有列數後都找不到位置,即說明上一個皇后需要重新放置 if (num==0)//若到退到0列都找不到合適位置,即返回 { return; } else { queue[--num]=-1;//上一個皇后列數清除 } } void main() { pickqueue(0);//第一個皇后 printf("總數為:%d", count); system("pause"); }
八皇后是一樣的,只需把皇后數改為8。