枚举算法又叫穷举算法,基本思想就是“有序地去尝试每一种可能”。
举个小小的例子:
?3*6538=3?*8256 ,求两个问号分别的值
#include<stdio.h>
int main()
{
int a;
for(a=1;a<=9;a++)
{
if((a*10+3)*6538==(30+a)*8256)
printf("%d",a);
}
return 0;
}
这是最简单的枚举了。
一、
题目:n根火柴,拼出形如A+B=C的式子(n<=24)
加号和等号都是两根
0:6根 1:二根 2:五根 3:五根 4:四根
5:五根 6:六根 7:三根 8:七根 9:六根
#include<stdio.h>
int map[10]= {6,2,5,5,4,5,6,3,7,6};
int fun(int x)
{
int num=0;
while(x/10!=0)
{
num=num+map[x%10];
x=x/10;
}
num=num+map[x];
return num;
}
int main()
{
int n,a,b,c;
scanf("%d",&n);
for(a=0; a<=1111; a++)
for(b=0; b<=1111; b++)
{
c=a+b;
if(fun(a)+fun(b)+fun(c)==n-4)
printf("%d+%d=%d\n",a,b,c);
}
return 0;
}
二、全排列
题目:输入n,求1~n的全排列
#include<stdio.h>
void fun(int a[],int p,int max)
{
int t;
if(p==max)
{
for(int i=0; i<max+1; i++)
printf("%d",a[i]);
printf("\n");
}
for(int i=p; i<=max; i++)
{
t=a[i];
a[i]=a[p];
a[p]=t;
fun(a,p+1,max);
t=a[i];
a[i]=a[p];
a[p]=t;
}
}
int main()
{
int i,n,len;
scanf("%d",&n);
int map[n];
len=sizeof(map)/sizeof(map[0]);
for(i=0; i<n; i++)
map[i]=i+1;
fun(map,0,len-1);
return 0;
}