一种便于理解的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 :=
. . . . . . . *
. . . * . . . .
* . . . . . . .
. . * . . . . .
. . . . . * . .
. * . . . . . .
. . . . . . * .
. . . . * . . .
- 一种便于理解的8皇后问题的回溯解法
- 回溯算法 8皇后问题的一种解法 适合初学者观察整个回溯的过程
- N皇后问题的回溯解法
- 八皇后问题的一种解法
- N皇后问题的一般解法--回溯法
- 八皇后的一个回溯递归解法
- 利用全排列八皇后问题的一种解法
- 八皇后问题回溯解法
- N皇后问题回溯解法
- 8皇后问题的两种解法
- “皇后”问题的回溯算法
- 四皇后问题的回溯
- 皇后问题的一个解法
- 八皇后问题的解法
- n皇后问题的解法
- 暴力求解法_回溯法(八皇后问题,素数环,困难的串)
- Queen 八皇后问题 回溯经典解法
- N皇后问题(回溯算法解法)
- jquery 小练习-获得一个文本框的值
- hadoop 执行问题解决
- Java之美之字符串
- 逆波兰式(后缀表达式)的表达求值
- Java解析XML
- 一种便于理解的8皇后问题的回溯解法
- SGU 103. Traffic Lights(最短路)
- 分类信息采集发布采集器软件
- 在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子
- Ext中动态的添加控件的方法
- 将中缀表达是转换为后缀表达式(逆波兰式)的一般算法
- VLC媒体播放器系统结构
- curl命令详解
- word 页眉