经典例题----八皇后问题(回溯)
题目简介:在8*8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇后,且能做到在水平方向、竖直方向和斜方向都没有冲突。请列出所有解法。
思考方向:根据规则,设置数组colume[7],数组下标为列值,该数组中存放的是行值 ,
可以得到 一、colume[前所有列] !=colume[当前所求列]
二、abs { colume[前所有列] — colume[当前所求列] } !=abs { 前所有列—当前所求列 }
解题步骤:一、从第一列开始,调用QueenSolution(),依次将前几列所得的结果与当前所在列尝试使用的行进行比较;
二、如果合法,则将当前位置入栈,递归调用下一列的QueenSolution();
三、直到所有列已经得到合法的位置,则调用printResult()函数打印,同时将最后一列的行出栈,继续尝试下一行的位置,循环。
解题代码:
#include <iostream> #include <cmath> #define QUEEN_NUM 8 int ResultCounter = 0; void printResult(int colume[]); bool check(int colume[], int col); void QueenSolution(int colume[], int col); int main(void) { //数组colume中存放的是行值 //即假设col[0]==3,表明第1列中皇后在第4行上 int colume[QUEEN_NUM] = { 0 }; QueenSolution(colume, 0); std::cout << "Solution Total Count: " << ResultCounter << std::endl; return 0; } //输出数组中的一组结果 void printResult(int colume[]) { for (int i = 0; i < QUEEN_NUM; i++) std::cout << "(" << colume[i] << ", " << i << ") "; std::cout << std::endl; ResultCounter++; } //检查当前列col,在现有情况下,能否放置皇后 bool check(int colume[], int col) { for (int i = 0; i < col; i++) { if (colume[i] == colume[col] || std::abs(colume[i] - colume[col]) == col - i) return false; } return true; } //尝试第col列上的所有解 //即在第col列的所有行上依次检验 //调用此函数时,表明从第0列到第col-1列都已经安置好了皇后 void QueenSolution(int colume[], int col) { if (col == QUEEN_NUM) { printResult(colume); return; } //新的一列中,皇后有可能在任意一行 for (int i = 0; i < QUEEN_NUM; i++) { colume[col] = i; //将这个皇后放在第i行,进行检查 if (check(colume, col)) QueenSolution(colume, col + 1); } }
部分答案:

杂七杂八:
#include <stdio.h> #include <math.h> #include <string.h> #include <ctype.h> int main() { int a,flag=0; char s[40]; const char *sep="."; char *p; while(scanf("%s",&s)!=EOF){ flag=0; p=strtok(s,sep); while(p){ if(isdigit(*p)){//头文件是ctype.h(c),cctype(c++); sscanf(p,"%d",&a);//#include <stdio.h> if(a<0||a>255){ flag=1; break;2 } } else{ flag=1; break; } p=strtok(NULL,sep);//只能判断一位 <string.h } if(flag==0) printf("Y\n"); else printf("N\n"); } return 0; }
浙公网安备 33010602011771号