算法学步:回溯法-8皇后问题
问题描述: 有八个皇后(可以当成八个棋子),如何在 8*8 的棋盘中放置八个皇后,使得任意两个皇后都不在同一条横线、纵线或者斜线上 做法: 从第一行开始,一行一行地考虑,这样起码可以保证皇后不在同一行; 考虑下面的每一行的时候,需要让新增加的棋子不在前面添加的棋子的左下、正下、右下,即新增加的棋子的列不等于前面棋子的列,它的行号+列号不等于前面棋子的行号加列号(不在左下),|行号-列号|不等于之前棋子的|行号-列号|(不在右下); 如果该行所有位置都不符合要求,则回溯到前一行,改变皇后的位置,继续试探; 如果试探到最后一行,所有皇后摆放完毕,则直接打印出 8*8 的棋盘。最后一定要记得将棋盘恢复原样,避免影响下一次摆放。 程序代码: /*回溯法,8皇后问题*/ #include<stdio.h> #include<iostream> #include<cmath> #include<math.h> using namespace std; int weizhi[8]={0};//用来保存八个棋子的位置 int counts=0; bool check(int hang, int lie); void Queens(int nhang); void print(); int main() { Queens(0); cout<<"8皇后问题的解的个数为:"<<counts<<endl;