C語言【微專案12】—N皇后問題[放置N個皇后在棋盤](採用回溯法-遞迴方式實現)
阿新 • • 發佈:2021-12-20
目錄
【TDTX】
【C99】
【注1】本文實現了回溯點的提示,以及實現了返回到第N層的提示!
【注2】只輸出了求解與輸出了探測得到的第一個解,其餘解也可以輕易得到!
【TDTX】
【C99】
【注1】本文實現了回溯點的提示,以及實現了返回到第N層的提示!
【注2】只輸出了求解與輸出了探測得到的第一個解,其餘解也可以輕易得到!
一、nhhhsdg.c
#include <stdio.h> #include <stdlib.h> #include <math.h> int co = 0;//已經正確放置皇后的個數記錄 int SetQueenLoaction(int* s,int n,int i) { int flag = 1; if(co == n) { return 1; } int j = 0; int status = 0; for(j = 0;j < n;j++) { for(int k = 0;k < i;k++) { if(j == s[k] || (abs(i-k) == abs(j - s[k])) ) { //printf("不能用:i = %d,j = %d\n",i,j); flag = 0; break; } } if(flag == 1) { s[i] = j; status = 1; printf("能放置:i = %d,j = %d\n",i,j); co++; if(SetQueenLoaction(s,n,i+1) == 0) { //這裡是回溯觸發點 s[i] = -1; status = 0; co--; printf("<在此第%d層(i:%d)觸發回溯!回溯到第%d(i:%d)層>\n",i+1+1,i+1,i+1,i); } else { return 1; } } else { flag = 1; } } if(status == 0) { return 0; } } int main() { int n = 0; puts("輸入皇后個數:"); scanf("%d",&n); int s[n];//s[i] = m,表示皇后放在第i行第m列 for(int i = 0;i < n;i++) { s[i] = -1; } puts("<----------計算過程(可看回溯演化)---------->"); SetQueenLoaction(s,n,0); puts("<----------計算完成(可看回溯演化)---------->\n"); puts("輸出最終結果(採用一維陣列展示):"); for(int i = 0;i < n;i++) { printf("%d ",s[i]); } puts("\n輸出最終結果(採用二維棋盤維展示):"); for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { if(s[i] == j) { printf("# "); } else { printf("x "); } } puts(""); } return 0; }
二、 執行結果示例
2.1 3皇后
2.2 4皇后
2.3 8皇后
------------------------------------------------------第十二次發專案類文章有點激動啊!-----------------------------------------------------
-----------------------------------------------------【C語言—微專案—自編練習】----------------------------------------------------------
----------------------------------------------------------------【TDTX】--------------------------------------------------------------------------