其实N皇后问题有一种解题思路就是回溯法
试探算法的算法思路
:为了求得问题的解,先选择某一种可能情况进行试探,在试探的过程中,一旦发现原来的选择的假设情况是错误的,就退回一步重新选择
,继续向前试探,如此反复进行,直到得到解或证明无解。
实例:生成彩票号码组合
思想:为求解,先选择某一种情况试探,试探过程中,一旦发现原来的选择的假设情况是错误的,就退回一步重新选择,继续向前试探,如此反复进行,直至得到解或证明无解。
如:迷宫探路
算法结构:
对解集合中的各解进行试探{
if(满足条件){
保存结果
if(完成集合中所有解的试探)
输出解
else
重复本过程进行下一步的试探(递归调用本函数)
}
else
恢复上一步保存结果之前的状态,进行另一部试探(递归调用本函数)
}
example(生成彩票号码组合):
7个1-29的数字组成,不能重复数字。
法一:(循环嵌套)

include<stdio.h>

int main() {
int i[7], j;
for (i[0] = 1; i[0] <= 29; i[0]++)
for (i[1] = 1; i[1] <= 29; i[1]++){
if (i[1] == i[0])
continue;
for (i[2] = 1; i[2] <= 29; i[2]++){
if (i[2] == i[1] || i[2] == i[0])
continue;
for (i[3] = 1; i[3] <= 29; i[3]++){
if (i[3] == i[2] || i[3] == i[1] || i[3] == i[0])
continue;
for (i[4] = 1; i[4] <= 29; i[4]++){
if (i[4] == i[3] || i[4] == i[2] || i[4] == i[1] || i[4] == i[0])
continue;
for (i[5] = 1; i[5] <= 29; i[5]++){
if (i[5] == i[4] || i[5] == i[3] || i[5] == i[2] || i[5] == i[1] || i[5] == i[0])
continue;
for (i[6] = 1; i[6] <= 29; i[6]++) {
if (i[6] == i[5] || i[6] == i[4] || i[6] == i[3] || i[6] == i[2] || i[6] == i[1] || i[6] == i[0])
continue;
for (j = 0; j < 7; j++)
printf("=", i[j]);
printf("\n");
getch();
}
}
}
}
}
}
return 0;
}

include <stdio.h>

include <conio.h>

include

include

include <iostream.h>

define MAXN 7 //设置每一注彩票的位数

define NUM 29 //设置组成彩票的数字

int num[NUM];
int lottery[MAXN];
void combine(int n, int m)
{
int i,j;
for(i=n;i>=m;i--)
{
lottery[m-1]=num[i-1]; //保存一位数字 ,将设置的数字复制给lottery[m-1]数组
if (m>1)
combine(i-1,m-1);//如果M不为1,那么就一直递归下去知道M为1为止。
else //若m=1,输出一注号码
{
for(j=MAXN-1;j>=0;j--)
printf("%3d",lottery[j]);
getch();
printf("\n");
}
}
}
void f(int i,int j)//建立一个递归函数用于检查随即数组中是否有数相等
{

if (num[i]==num[j])//如果数组里有数相等
{
num[i]=rand()%29+1;//那么把数组里的数再次随机化
f(i,j);//再次检查数组里的数是否相等,直到随即到完全不同的数为止
}
else
return;//如果不等,那么j++,继续检查下一个数(num[j])与num[i]是否相等
}
int main()
{
int i;
srand(time(0));
for(i=0;i<NUM;i++) //设置彩票各位数字
//num[i]=i+1;
num[i]=rand()%29+1;//这样每次的彩票就是随机抽取的,可以真正模拟“机选”了
for (i=0;i<NUM;i++)
{
for (int j=i+1;j<NUM;j++)
{
f(i,j);
}
}
for(i=0;i<MAXN;i++)
lottery[i]=0;
combine(NUM,MAXN);
getch();
return 0;
}