算法思想篇(6)————试探算法
使用试探算法解题的基本步骤如下所示。
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
试探法为了求得问题的正确解,会先委婉的试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉的退回一步重新选择,然后继续向前试探,如此厥驴般的反复进行,直至得到解或证明无解时才死心。
下面通过一个简单的例子说明一下试探算法的思想:
假设有一种29选7的彩票,每注由7个1到29的数字组成,且这7个数字不能相同,编写程序列出所有的号码组合。
代码如下:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 29选7彩票组合
#include <stdio.h>
#define MAXN 7 //设置每一注彩票的位数
#define NUM 29 //设置组成彩票的数字
int num[NUM];
int lottery[MAXN];
/******************************************************
函数名:combine(int n, int m)
参数:组成彩票的数字,每一注彩票的位数
功能:29选7彩票组合
*******************************************************/
void combine(int n, int m)
{
int i,j;//n最开始为29,m为7
for(i=n;i>=m;i--)
{
lottery[m-1]=num[i-1];//保存一位数字,第一位是29
if (m>1)
combine(i-1,m-1);
else //若m=1,输出一注号码
{
for(j=MAXN-1;j>=0;j--)
printf("%3d",lottery[j]);
printf("\n");
}
}
}
int main()
{
int i,j;
for(i=0;i<NUM;i++) //设置彩票各位数字
num[i]=i+1;//num={1,2,3...29}
for(i=0;i<MAXN;i++)
lottery[i]=0;
combine(NUM,MAXN);
return 0;
}
运行结果如下:
后面还有很多。。。。。。

浙公网安备 33010602011771号