套用回溯 公式程序:
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;
}
运行截图: