递归---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);
        }        
    }
}

 

---恢复内容结束---

posted @ 2015-05-09 23:05  wxquare  阅读(183)  评论(0编辑  收藏  举报