演算法作業——八皇后問題擴充套件到N皇后
阿新 • • 發佈:2018-12-15
問題背景:在 8×8 格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,輸出所有擺法。
環境:VS2017
程式碼:
#include "pch.h" #include <iostream> #include <cstdio> #include <sys/timeb.h> using namespace std; const int MAX_SIZE = 100; enum flag { blank = '+', queen = 'O' }; char Chess[MAX_SIZE][MAX_SIZE]; //棋盤 int n; //解決n皇后問題 int total; //對棋盤進行初始化 void Init() { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) Chess[i][j] = blank; total = 0; } //判斷(r,c)位置是否可放置 bool Judge(int r, int c) { int i, j; for (i = r + 1; i < n; i++) if (Chess[i][c] == queen) return false; //說明c列上已有一皇后 for (i = c + 1; i < n; i++) if (Chess[r][i] == queen) return false; //說明r行上已有一皇后 for (i = r + 1, j = c + 1; (i < n) && (j < n); i++, j++) if (Chess[i][j] == queen) return false; //對角線上已有一皇后 for (i = r + 1, j = c - 1; (i < n) && (j >= 0); i++, j--) if (Chess[i][j] == queen) return false; //對角線上已有一皇后 return true; } //遞迴演算法主程式 void Backtrack(int k, int cnt) { if (k < 0 || cnt == n) { if (cnt == n) { printf("No.%d:\n", ++total); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) printf(" %c ", Chess[i][j]); putchar('\n'); } putchar('\n'); } } else { int r = k / n, c = k % n; if (Judge(r, c)) { Chess[r][c] = queen; Backtrack(k - 1, cnt + 1); Chess[r][c] = blank; } Backtrack(k - 1, cnt); } } int main() { timeb t1, t2; long kk; cout << "輸入皇后個數:"; while (cin >> n) { Init(); ftime(&t1); Backtrack(n*n - 1, 0); ftime(&t2); cout << "計算" << n << "皇后問題總共可有" << total << "種擺法!" << endl; kk = (t2.time - t1.time) * 1000 + t2.millitm - t1.millitm; cout << "本次遞迴耗時:" << kk << "毫秒" << endl; system("PAUSE"); cout << "輸入皇后個數:"; } return 0; }
結果: