8皇后问题(回溯法)

//8皇后(回溯法)

#include <iostream>
using namespace std;


void queen_all(int k);//回溯的算法函数
int col[9];
bool row[9], digLeft[17], digRight[17];


int main()
{
	int j;


	for (j = 0; j <= 8; j++)  row[j] = true;
	for (j = 0; j <= 16; j++) digLeft[j] = digRight[j] = true;


	queen_all(1);


	return 0;
}


//8*8棋盘的第K列上找合理的配置
void queen_all(int k)
{


	int i, j;
	char awn;                 //存储是否继续寻找的标志


	for (i = 1; i <= 8;i++)   //依次在1至8行上配置K列的皇后


	if (row[i] && digLeft[k+i-1] && digRight[8+k-i]){                      //可行位置
		col[k] = i;                                                 //表示位置为K列的i行
		row[i] = digLeft[k+i-1] = digRight[8+k-i] = false;                        //表示置有皇后


		if (k == 8){                                                     //找到一个可行解
			for (j = 1; j <= 8; j++) 
				cout << j << " " << col[j] << '\t';                      //列和行


			cout << endl << "是否需要继续寻找(Q--表示退出,其他继续:)";
			cin >> awn;
			if (awn == 'Q'|| awn == 'q') exit(0);
		}


		else queen_all(k + 1);                                   //递归至k+1列
		row[i] = digLeft[k+i-1] = digRight[8+k-i] = true;       //为下个可行方案做准备


	}

}

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/79674131
今日推荐