算法设计与分析:第五章 回溯法 5.2n皇后

/*
n皇后问题
*/
#include <iostream>


using namespace std;


void output(int x[] , int n)
{
	for(int i = 1 ; i <= n ; i++)
	{
		for(int j = 1 ; j <= n ; j++)
	}
}

//判断当前列能否摆放成功。判断存不存在相同列或者在同一个斜线上
bool place(int x[] , int k)
{
	for(int i = 1 ; i < k ; i++)
	{
		if(x[i] == x[k] || abs(x[i] - x[k]) == abs(i - k))
		{
			return false;
		}
	}
	return true;
}

int backTrace(int x[], int n)
{
	int k = 1 ; 
	x[1] = 0;
	while(k > 0)
	{
		x[k] = x[k] + 1;
		//如果不能摆放,尝试下一个列
		while(x[k] <= n && !place(x , k))
		{
			x[k] = x[k] + 1;
		}
		//如果存在满足条件的列
		if(x[k] <= n)
		{
			//如果所有皇后摆放完毕,输出结果
			if(k == n)
			{
				break;
			}
			//继续处理下一个皇后,当前列摆放正确。处理下一个皇后,把其放在0列作为初始化
			else
			{
				k++;
				x[k] = 0;
			}
		}
		//如果不满足,回溯。先置当前列的值为初始值,回溯到前一行
		else
		{
			x[k] = 0;
			k--;
		}
	}
}

void process()
{
	int n;
	int x[100];
	//初始化,设置么一行
	for(int i = 0 ; i < 100 ; i++)
	{
		x[i] = i;
	}
	while(cin >> n)
	{
		int iResult = backTrace(x , n);
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

你可能感兴趣的:(回溯,算法设计与分析)