递归---n皇后
---恢复内容开始---
#include "stdafx.h" #include <iostream> #include <fstream> //文件流 #include <iomanip> #include <cstdlib> using namespace std; void queenSolve(int rowCurrent, int n, int *&queenlist, int &count, ofstream &os); void Print(int n, int *&queenlist, ofstream &os); bool Check(int rowCurrent, int *&queelist); int main() { int n; cout << "请输入规模n: " << endl; cin >> n; if (n<4) { cerr << "问题规模必须大于4" << endl; return 0; } int *queenlist = new int[n]; int count = 0; ofstream os; os.open("result.txt"); queenSolve(0,n, queenlist, count, os); cout << "共有" << count << "种解法" << endl; os.close(); system("pause"); return 0; } void Print(int n, int *&queenlist, ofstream &os){ for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++){ os <<(queenlist[i] == j ? 1 : 0); os << setw(2); //设置域宽为n个字符,<iomanip> } os << "\n"; } os << "\n"; } bool Check(int rowCurrent, int *&queelist){ for (int i = 0; i < rowCurrent; i++){ if (queelist[rowCurrent] == queelist[i]) return false; if (abs(rowCurrent - i) == abs(queelist[rowCurrent] - queelist[i])) //<cstdlib> return false; } return true; } void queenSolve(int rowCurrent, int n, int *&queenlist, int &count, ofstream &os) { if (rowCurrent == n) { ++count; os << "第" << count << "个解" << endl; Print(n,queenlist,os); } else{ for (int i = 0; i < n; i++) { queenlist[rowCurrent] = i; if (Check(rowCurrent, queenlist)) queenSolve(rowCurrent+1, n, queenlist, count, os); } } }
---恢复内容结束---