看数据结构写代码(34) 树与回溯法(二)排序树(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;
}

运行截图:

技术分享



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。