您的位置:首页 > 其它

算法思想篇(6)————试探算法

2015-08-14 11:30 246 查看
使用试探算法解题的基本步骤如下所示。

(1)针对所给问题,定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

试探法为了求得问题的正确解,会先委婉的试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉的退回一步重新选择,然后继续向前试探,如此厥驴般的反复进行,直至得到解或证明无解时才死心。

下面通过一个简单的例子说明一下试探算法的思想:

假设有一种29选7的彩票,每注由7个1到29的数字组成,且这7个数字不能相同,编写程序列出所有的号码组合。

代码如下:

[code]//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;
}


运行结果如下:




后面还有很多。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: