一种便于理解的8皇后问题的回溯解法

来源:互联网 发布:软件架构包含服务器吗 编辑:程序博客网 时间:2024/05/19 16:36
/*8皇后问题的C++算法author: alaclp@163.compublished date: 2013-4-8问题:若是16皇后问题?皇后数 解个数1 12 03 04 25 106 47 408 929 35210 72411 268012 14200*/#include <iostream>#include <stdio.h>#include <vector>#include <stdlib.h>using namespace std;//位置数据类型typedef struct pos {int row;int col;pos(int x, int y): row(x), col(y) {};pos() : row(-1), col(-1) {};} pos;#define nrow 8#define ncol 8vector<pos> rst;        //存放皇后位置的向量int resultCount = 0;    //存放排放可能数量int vals[nrow][ncol] = {0}; //初始化所有元素值为0//调试时输出中间状态的值void outputVals(){cout << "-->" << endl;for(int i = 0; i < nrow; i++){for(int j = 0; j < ncol; j++)printf("%2d ", vals[i][j]);cout << endl;}cout << endl;}//备份中间状态的值到bkvals中void backup(int *bkvals){int cnt = 0;for(int i = 0; i < nrow; i++){for(int j = 0; j < ncol; j++)bkvals[cnt++] = vals[i][j];}}//从备份的bkvals中回复之前的搜索状态给valsvoid restore(int *bkvals){int cnt = 0;for(int i = 0; i < nrow; i++){for(int j = 0; j < ncol; j++)vals[i][j] = bkvals[cnt++];}}//取得下一个可能的合理位置pos getNextPos(){pos p;for(int i = 0; i < nrow; i++)for(int j = 0; j < ncol; j++)if (vals[i][j] == 0){p.row = i;p.col = j;return p;}return p;}//设置p位置的行、列、斜线元素值为-1void setNot(pos p){//设置与p同行的元素值为-1for(int i = 0; i < nrow; i++)vals[i][p.col] = -1;//设置与p同列的元素值为-1for(int i = 0; i < nrow; i++)vals[p.row][i] = -1;//设置与p在四个方向斜向的元素值为-1for(int i = 0; i < nrow; i++){if ( (p.row - i >= 0 && p.row - i < nrow) && (p.col - i >= 0 && p.col - i < nrow) )vals[p.row-i][p.col-i] = -1;if ( (p.row - i >= 0 && p.row - i < nrow) && (p.col + i >= 0 && p.col + i < nrow) )vals[p.row-i][p.col+i] = -1;if ( (p.row + i >= 0 && p.row + i < nrow) && (p.col - i >= 0 && p.col - i < nrow) )vals[p.row+i][p.col-i] = -1;if ( (p.row + i >= 0 && p.row + i < nrow) && (p.col + i >= 0 && p.col + i < nrow) )vals[p.row+i][p.col+i] = -1;}//设置该位置的值为1,只是为了中间输出时便于查看vals[p.row][p.col] = 1;}//N皇后问题的递归解法void queueN(){pos p;//获取一个适合放皇后的位置p = getNextPos();//若无满足条件的位置if (p.row == -1){//若已排放N个皇后,则计数并输出结果if (rst.size() == nrow){int tvals[nrow][ncol] = {0};resultCount++;cout << "Result " << resultCount << " := " << endl;for(int i = 0; i < nrow; i++)tvals[rst[i].row][rst[i].col] = 2;for(int i = 0; i < nrow; i++){for(int j = 0; j < nrow; j++)if (tvals[i][j] == 0)cout << ". ";elsecout << "* ";cout << endl;}cout << endl;return;}//无解else{//cout << "Not found" << endl;return;}}else{//存储p到结果中rst.push_back(p);//分配备份数据用内存空间int *bkvals = new int[nrow * ncol];//备份当前搜索状态backup(bkvals);//设置p点及其行、列、斜线点不可搜索setNot(p);//outputVals();//搜索后续皇后排放位置queueN();//若此次搜索完毕,则恢复搜索前的vals状态值restore(bkvals);//删除申请的内存delete []bkvals;//弹出上次压栈操作压入的元素rst.pop_back();//设置p点为已搜索点vals[p.row][p.col] = 1;//搜索p后的点,看是否满足条件queueN();}}int main(){  queueN();  return 0;} 

运行结果:

Result 1 :=
* . . . . . . .
. . . . * . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . * . . . .

Result 2 :=
* . . . . . . .
. . . . . * . .
. . . . . . . *
. . * . . . . .
. . . . . . * .
. . . * . . . .
. * . . . . . .
. . . . * . . .

Result 3 :=
* . . . . . . .
. . . . . . * .
. . . * . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . . * . . .
. . * . . . . .

Result 4 :=
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
. . . . . * . .
. . * . . . . .

Result 5 :=
. * . . . . . .
. . . * . . . .
. . . . . * . .
. . . . . . . *
. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .

Result 6 :=
. * . . . . . .
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .

Result 7 :=
. * . . . . . .
. . . . * . . .
. . . . . . * .
. . . * . . . .
* . . . . . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .

Result 8 :=
. * . . . . . .
. . . . . * . .
* . . . . . . .
. . . . . . * .
. . . * . . . .
. . . . . . . *
. . * . . . . .
. . . . * . . .

Result 9 :=
. * . . . . . .
. . . . . * . .
. . . . . . . *
. . * . . . . .
* . . . . . . .
. . . * . . . .
. . . . . . * .
. . . . * . . .

Result 10 :=
. * . . . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .
. . . . . . . *
. . . . * . . .
* . . . . . . .
. . . * . . . .

Result 11 :=
. * . . . . . .
. . . . . . * .
. . . . * . . .
. . . . . . . *
* . . . . . . .
. . . * . . . .
. . . . . * . .
. . * . . . . .

Result 12 :=
. * . . . . . .
. . . . . . . *
. . . . . * . .
* . . . . . . .
. . * . . . . .
. . . . * . . .
. . . . . . * .
. . . * . . . .

Result 13 :=
. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
. . . . . * . .

Result 14 :=
. . * . . . . .
. . . . * . . .
. * . . . . . .
. . . . . . . *
* . . . . . . .
. . . . . . * .
. . . * . . . .
. . . . . * . .

Result 15 :=
. . * . . . . .
. . . . * . . .
. * . . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .
. . . . . . * .
* . . . . . . .

Result 16 :=
. . * . . . . .
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . . * . .

Result 17 :=
. . * . . . . .
. . . . * . . .
. . . . . . . *
. . . * . . . .
* . . . . . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .

Result 18 :=
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . * . . .
. . . . . . . *
* . . . . . . .
. . . . . . * .
. . . * . . . .

Result 19 :=
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .
* . . . . . . .
. . . * . . . .
. . . . . . . *
. . . . * . . .

Result 20 :=
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .
. . . . * . . .
* . . . . . . .
. . . . . . . *
. . . * . . . .

Result 21 :=
. . * . . . . .
. . . . . * . .
. . . * . . . .
* . . . . . . .
. . . . . . . *
. . . . * . . .
. . . . . . * .
. * . . . . . .

Result 22 :=
. . * . . . . .
. . . . . * . .
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . * . . .
. . . . . . * .
* . . . . . . .

Result 23 :=
. . * . . . . .
. . . . . * . .
. . . . . . . *
* . . . . . . .
. . . * . . . .
. . . . . . * .
. . . . * . . .
. * . . . . . .

Result 24 :=
. . * . . . . .
. . . . . * . .
. . . . . . . *
* . . . . . . .
. . . . * . . .
. . . . . . * .
. * . . . . . .
. . . * . . . .

Result 25 :=
. . * . . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .

Result 26 :=
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . . . . . *
. . . . * . . .
* . . . . . . .
. . . * . . . .
. . . . . * . .

Result 27 :=
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .
* . . . . . . .
. . . . * . . .

Result 28 :=
. . * . . . . .
. . . . . . . *
. . . * . . . .
. . . . . . * .
* . . . . . . .
. . . . . * . .
. * . . . . . .
. . . . * . . .

Result 29 :=
. . . * . . . .
* . . . . . . .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .

Result 30 :=
. . . * . . . .
* . . . . . . .
. . . . * . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .
. . . . . . * .
. * . . . . . .

Result 31 :=
. . . * . . . .
. * . . . . . .
. . . . * . . .
. . . . . . . *
. . . . . * . .
* . . . . . . .
. . * . . . . .
. . . . . . * .

Result 32 :=
. . . * . . . .
. * . . . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .
. . . . . . . *
* . . . . . . .
. . . . * . . .

Result 33 :=
. . . * . . . .
. * . . . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .
. . . . . . . *
. . . . * . . .
* . . . . . . .

Result 34 :=
. . . * . . . .
. * . . . . . .
. . . . . . * .
. . . . * . . .
* . . . . . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .

Result 35 :=
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . . * . .

Result 36 :=
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . . * . .
* . . . . . . .
. . * . . . . .
. . . . * . . .
. . . . . . * .

Result 37 :=
. . . * . . . .
. . . . . * . .
* . . . . . . .
. . . . * . . .
. * . . . . . .
. . . . . . . *
. . * . . . . .
. . . . . . * .

Result 38 :=
. . . * . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . * . . .

Result 39 :=
. . . * . . . .
. . . . . * . .
. . . . . . . *
. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. * . . . . . .

Result 40 :=
. . . * . . . .
. . . . . . * .
* . . . . . . .
. . . . . . . *
. . . . * . . .
. * . . . . . .
. . . . . * . .
. . * . . . . .

Result 41 :=
. . . * . . . .
. . . . . . * .
. . * . . . . .
. . . . . . . *
. * . . . . . .
. . . . * . . .
* . . . . . . .
. . . . . * . .

Result 42 :=
. . . * . . . .
. . . . . . * .
. . . . * . . .
. * . . . . . .
. . . . . * . .
* . . . . . . .
. . * . . . . .
. . . . . . . *

Result 43 :=
. . . * . . . .
. . . . . . * .
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .

Result 44 :=
. . . * . . . .
. . . . . . . *
* . . . . . . .
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .
. . . . * . . .

Result 45 :=
. . . * . . . .
. . . . . . . *
* . . . . . . .
. . . . * . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .
. . * . . . . .

Result 46 :=
. . . * . . . .
. . . . . . . *
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .

Result 47 :=
. . . . * . . .
* . . . . . . .
. . . * . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . . . . * .
. . * . . . . .

Result 48 :=
. . . . * . . .
* . . . . . . .
. . . . . . . *
. . . * . . . .
. * . . . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .

Result 49 :=
. . . . * . . .
* . . . . . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . * . . . .

Result 50 :=
. . . . * . . .
. * . . . . . .
. . . * . . . .
. . . . . * . .
. . . . . . . *
. . * . . . . .
* . . . . . . .
. . . . . . * .

Result 51 :=
. . . . * . . .
. * . . . . . .
. . . * . . . .
. . . . . . * .
. . * . . . . .
. . . . . . . *
. . . . . * . .
* . . . . . . .

Result 52 :=
. . . . * . . .
. * . . . . . .
. . . . . * . .
* . . . . . . .
. . . . . . * .
. . . * . . . .
. . . . . . . *
. . * . . . . .

Result 53 :=
. . . . * . . .
. * . . . . . .
. . . . . . . *
* . . . . . . .
. . . * . . . .
. . . . . . * .
. . * . . . . .
. . . . . * . .

Result 54 :=
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
. . . . . . * .

Result 55 :=
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . . * .
. * . . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .

Result 56 :=
. . . . * . . .
. . * . . . . .
. . . . . . . *
. . . * . . . .
. . . . . . * .
* . . . . . . .
. . . . . * . .
. * . . . . . .

Result 57 :=
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .
. * . . . . . .

Result 58 :=
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . . * . .
. . * . . . . .

Result 59 :=
. . . . * . . .
. . . . . . * .
. * . . . . . .
. . . * . . . .
. . . . . . . *
* . . . . . . .
. . * . . . . .
. . . . . * . .

Result 60 :=
. . . . * . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . * . . . .
. . . . . . . *

Result 61 :=
. . . . * . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . . . . . *
. . . * . . . .

Result 62 :=
. . . . * . . .
. . . . . . * .
. . . * . . . .
* . . . . . . .
. . * . . . . .
. . . . . . . *
. . . . . * . .
. * . . . . . .

Result 63 :=
. . . . * . . .
. . . . . . . *
. . . * . . . .
* . . . . . . .
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .

Result 64 :=
. . . . * . . .
. . . . . . . *
. . . * . . . .
* . . . . . . .
. . . . . . * .
. * . . . . . .
. . . . . * . .
. . * . . . . .

Result 65 :=
. . . . . * . .
* . . . . . . .
. . . . * . . .
. * . . . . . .
. . . . . . . *
. . * . . . . .
. . . . . . * .
. . . * . . . .

Result 66 :=
. . . . . * . .
. * . . . . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . * . . .
. . . . . . . *
. . . * . . . .

Result 67 :=
. . . . . * . .
. * . . . . . .
. . . . . . * .
* . . . . . . .
. . . * . . . .
. . . . . . . *
. . . . * . . .
. . * . . . . .

Result 68 :=
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . * . . . .

Result 69 :=
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . . . . . *
. . . * . . . .
. * . . . . . .
. . . . . . * .
. . . . * . . .

Result 70 :=
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . . . . . *
. . . . * . . .
. * . . . . . .
. . . * . . . .
. . . . . . * .

Result 71 :=
. . . . . * . .
. . * . . . . .
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . . * . . . .
. * . . . . . .
. . . . . . . *

Result 72 :=
. . . . . * . .
. . * . . . . .
. . . . * . . .
. . . . . . . *
* . . . . . . .
. . . * . . . .
. * . . . . . .
. . . . . . * .

Result 73 :=
. . . . . * . .
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . * . . . .
. . . . . . . *
* . . . . . . .
. . . . * . . .

Result 74 :=
. . . . . * . .
. . * . . . . .
. . . . . . * .
. * . . . . . .
. . . . . . . *
. . . . * . . .
* . . . . . . .
. . . * . . . .

Result 75 :=
. . . . . * . .
. . * . . . . .
. . . . . . * .
. . . * . . . .
* . . . . . . .
. . . . . . . *
. * . . . . . .
. . . . * . . .

Result 76 :=
. . . . . * . .
. . . * . . . .
* . . . . . . .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . . . . * .
. . * . . . . .

Result 77 :=
. . . . . * . .
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . * . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .

Result 78 :=
. . . . . * . .
. . . * . . . .
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . * . . .
. * . . . . . .
. . . . . . . *

Result 79 :=
. . . . . * . .
. . . * . . . .
. . . . . . * .
* . . . . . . .
. . . . . . . *
. * . . . . . .
. . . . * . . .
. . * . . . . .

Result 80 :=
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . * . . . . .

Result 81 :=
. . . . . . * .
* . . . . . . .
. . * . . . . .
. . . . . . . *
. . . . . * . .
. . . * . . . .
. * . . . . . .
. . . . * . . .

Result 82 :=
. . . . . . * .
. * . . . . . .
. . . * . . . .
* . . . . . . .
. . . . . . . *
. . . . * . . .
. . * . . . . .
. . . . . * . .

Result 83 :=
. . . . . . * .
. * . . . . . .
. . . . . * . .
. . * . . . . .
* . . . . . . .
. . . * . . . .
. . . . . . . *
. . . . * . . .

Result 84 :=
. . . . . . * .
. . * . . . . .
* . . . . . . .
. . . . . * . .
. . . . . . . *
. . . . * . . .
. * . . . . . .
. . . * . . . .

Result 85 :=
. . . . . . * .
. . * . . . . .
. . . . . . . *
. * . . . . . .
. . . . * . . .
* . . . . . . .
. . . . . * . .
. . . * . . . .

Result 86 :=
. . . . . . * .
. . . * . . . .
. * . . . . . .
. . . . * . . .
. . . . . . . *
* . . . . . . .
. . * . . . . .
. . . . . * . .

Result 87 :=
. . . . . . * .
. . . * . . . .
. * . . . . . .
. . . . . . . *
. . . . . * . .
* . . . . . . .
. . * . . . . .
. . . . * . . .

Result 88 :=
. . . . . . * .
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . * . .
. . . . . . . *
. * . . . . . .
. . . * . . . .

Result 89 :=
. . . . . . . *
. * . . . . . .
. . . * . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . * . . . . .
. . . . . * . .

Result 90 :=
. . . . . . . *
. * . . . . . .
. . . . * . . .
. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . * . . . .
. . . . . * . .

Result 91 :=
. . . . . . . *
. . * . . . . .
* . . . . . . .
. . . . . * . .
. * . . . . . .
. . . . * . . .
. . . . . . * .
. . . * . . . .

Result 92 :=
. . . . . . . *
. . . * . . . .
* . . . . . . .
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .
. . . . * . . .


原创粉丝点击