心胸决定格局,眼界决定境界...

八皇后问题

void queen8(int n, int* C, int cur)
{
	if (cur == n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << C[i] << ",";
		}
		cout << endl;
	}
	else
	{
		for (int i = 0; i < n; i++)//每一层,尝试所有的列
		{
			int ok = 1;
			//排除掉之前的元素的攻击范围
			for (int j = 0; j < cur; j++)//之前出现过cur个元素,遍历
			{
				if (C[j] == i || (cur - j == abs(i - C[j])))//不一定满足条件,因为都与cur关联,与cur不关联的两个点貌似没有考虑?目前考虑cur的位置,之前的位置肯定都满足条件,所以只需要判断cur与之前的点是否在斜线上
				{
					ok = 0;
					break;
				}
					
			}
			if (ok)
			{
				C[cur] = i;//选择的结果保存在C中
				queen8(n, C, cur + 1);//
			}

		}
	}
}

int  visit[2][2 * 8];
//保存过去所有节点,攻击的范围
//int visit[0]  出现的列   
//int visit[1]  出现的主对角线  x-y+n 或者y-x+n    2*n
//int visit[2]  出现的副对角线  x+y                      2*n
void queen8(int n, int* C, int cur)
{
	if (cur == n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << C[i] << ",";
		}
		cout << endl;
	}
	else
	{
		for (int i = 0; i < n; i++)//每一层,尝试所有的列
		{
			if (!visit[0][i] && !visit[1][i - cur + n] && !visit[2][i + cur])
			{
				C[cur] = i;
				visit[0][i] = visit[1][i - cur + n] = visit[2][i+cur] = 1;
				queen8(n, C, cur + 1);
				visit[0][i] = visit[1][i - cur + n] = visit[2][i + cur] = 0;
			}
			
			
		}
	}
}

#include <algorithm>
int main(int argc, const char* argv[])
{
	//回溯法
	//八皇后问题
	//逐行 指定列数
	//C[j] = i ; 第j行指定第i列
	//每一行,遍历所有列尝试,逐行尝试
	int C[8];
	queen8(8, C, 0);

  

posted @ 2019-02-12 16:17  WELEN  阅读(88)  评论(0)    收藏  举报