看数据结构写代码(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; }
运行截图:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。