码迷,mamicode.com
首页 > 编程语言 > 详细

看数据结构写代码(34) 树与回溯法(二)排序树(8皇后问题)

时间:2015-04-01 17:43:01      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:8皇后问题   n皇后问题   回溯法实现8皇后问题   回溯法   

套用回溯 公式程序:

void backtrack (int t)

{

    if (t > n) {

       // 到达叶子结点,将结果输出

       output (x);

    }

    else {

       // 遍历结点t的所有子结点

       for (int i = f(n,t); i <= g(n,t); i ++ ) {

           x[t] = h[i];

           // 如果不满足剪枝条件,则继续遍历

           if (constraint (t) && bound (t)) 

              backtrack (t + 1);

       }

    }

}

写出 8皇后问题,不难

只要注意一下 判断位置 和否 函数的写法,是 判断 不在一列,并且 不在 对角线上 的写法

bool isPlace(int k){
	for (int i = 0; i < k; i++)
	{
		if (abs(k -i) == abs(col[k] - col[i]) || col[k] == col[i])// 在一列,或者在对角线上
		{
			return false;
		}
	}
	return true;
}

完整代码如下:

// EightQueen.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <math.h>
#define SIZE	8
int col[SIZE];

bool isPlace(int k){
	for (int i = 0; i < k; i++)
	{
		if (abs(k -i) == abs(col[k] - col[i]) || col[k] == col[i])// 在一列,或者在对角线上
		{
			return false;
		}
	}
	return true;
}

void eightQueen(int times,int n){
	if (times >= n)
	{
		static int times = 0;
		times++;
		printf("%d次为:\n",times);
		for (int i = 0; i < n; i++)
		{
			printf("%d\t",col[i]);
		}
		printf("\n");
	}
	else
	{
		for (int i = 0; i < n; i++)
		{
			col[times] = i;
			if (isPlace(times))
			{
				eightQueen(times+1,n);
			}
		}
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	eightQueen(0,8);
	return 0;
}

运行代码,打印出 92个 解。

源代码网盘地址:点击打开链接


下面 是 求 一个字符串的全排列问题:

// String.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <cstring>

#define MAX_SIZE 1000
static char subString[MAX_SIZE];

void swapString(int index1,int index2,char * string){
	char temp = string[index1];
	string[index1] = string[index2];
	string[index2] = temp;
}

void getSubString(int times,char * string){
	int len = strlen(string);
	if (times >= len)
	{
		for (int i = 0; i < len; i++)
		{
			printf("%c\t",subString[i]);
		}
		printf("\n");
	}
	else
	{
		for (int i = times; i < len; i++)
		{
			subString[times] = string[i];
			swapString(times,i,string);
			getSubString(times+1,string);
			swapString(times,i,string);
		}
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	char string[] = "abc";
	getSubString(0,string);
	return 0;
}

运行截图:

技术分享



看数据结构写代码(34) 树与回溯法(二)排序树(8皇后问题)

标签:8皇后问题   n皇后问题   回溯法实现8皇后问题   回溯法   

原文地址:http://blog.csdn.net/fuming0210sc/article/details/44808893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!