看数据结构写代码(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 SIZE8int 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 1000static 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皇后问题)

相关文章:

你感兴趣的文章:

标签云: