试探算法的思路
用试探法解题的一般步骤如下:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索解空间结构
(3)以深度优先方式搜索空间,并再搜索过程种用减枝函数避免无效搜索。
试探法为了求得问题得正确解,先试探某一种可能情况。在试探过程种,一旦发现原来得选择的假设情况是错误的,就退回一步重新算则,继续向前试探,如此反复进行,直至得到解或证明无解
八皇后问题
八皇后问题是一个古老而著名得问题,是试探法的典型例题。该问题由19世纪数学家高斯于1850年手工解决:在8*8格的国际象棋棋盘摆放8个皇后,使其不能相互公鸡,即任意两个皇后不能处于同一行,同一列或同一斜线上,问由多少种摆法。
算法思想:
做之前首先将问题简化,设为4*4的棋盘。易知有2种摆法。每行摆在列2413和3142上。
#include<stdio.h>
#define N 8
int solution[N],j,k,count,sols;
int place(int row,int col)
{
for(j=0;j<row;j++){
if(row-j==solution[row]-solution[j]||row+solution[row]==j+solution[j]||solution[j]==solution[row]){
return 0;
}
}
return 1;
}
void bcaktrack(int row)
{
count++;
if(N==row){
sols++;
for(k=0;k<N;k++){
printf("%d\t",solution[k]);
}
printf("\n\n");
}
else{
int i;
for(i=0;i<N;i++){
solution[row]=i;
if(place(row,i)){
bcaktrack(row+1);
}
}
}
}
void queens()
{
bcaktrack(0);
}
void main()
{
queens();
printf("Total Solution:%d\n",sols);
}
彩票组合
假设有一种彩票,每注由7个1~29的数字组成,且这7个数字不能相同,编写程序生成所有的号码组合。
#include<stdio.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]; //保存一位数字
if(m>1){
combine(i-1,m-1);
}
else{ //若m=1,输入一注号码
for(j=MAXN-1;j>=0;j--){
printf("%3d",lottery[j]);
}
getchar();
printf("\n");
}
}
}
void main()
{
int i;
for(i=0;i<NUM;i++){ //设置彩票各位数
num[i]=i+1;
}
for(i=0;i<MAXN;i++){
lottery[i]=0;
}
combine(NUM,MAXN);
}