N皇后问题---回溯法之一维数组存储

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。

(注:本文采用一维数组存储棋盘,并利用特定性质解决皇后不冲突的问题,新手最好别看,先从二维数组开始学起,不然会很难受的。)

本题利用回溯法解决N皇后问题,其次,介绍memset的利弊(几乎花了一下午时间查bug,结果才知道是这里出问题了)

   本文大致思路:存储N个皇后到chessboard中,从i开始,每次找到一个可以放入的位置,若该位置不能放,回溯或者退出,若该位置是最后一个,则要输出这一种情况,count_num+1.最终结果即满足了条件

 

#include 
#include 
#include 
#include 
//#include     //不是c++时INT_MAX的头文件是这个
using namespace std;

//a[i] == j即可确定该处可以有皇后
int chessboard[10];
int n;  //皇后数



int chess(int row, int col){

	for(int i = 0; i < n; i++){       //i是每一行, a[i]是列,abs(row - i) == abs(col - a[i])即可满足对角线的重复,返回0即可
		if((chessboard[i] == col) || (abs(row - i) == abs(col - chessboard[i])))
			return 0;
	}
	return 1;
}

void print(){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(chessboard[i] != j)
				cout<<'.'<<" ";
			else
				cout<<'#'<<" ";
		}
		cout<

  小结:读者可先利用chessboard[0][0]来测一下,就会理解很多了,其次,chessboard[]中存储的是路径.

深入挖掘N皇后:N皇后文字详解  但是和我代码差不多,个人感觉不好理解,还不如直接看代码好一点

最后温馨提醒,别用INT_MAX 初始化数组,初始化0没问题,但是如果你你按照我main函数中的memset函数就会出错,具体看链接memset常见错误


你可能感兴趣的:(C语言入门)