暴力的枚举

枚举算法又叫穷举算法,光听名字就是能知道这个很暴力。

有一个题:□3 * 6528 = 3□ * 8256,在两个方框里面填入相同的数字使得等式成立。你可能会觉得这个很简单,3行代码就可以搞定:

for (i = 1; i <= 9; i++) {
    if ((i * 10 + 3) * 6528 = (3 * 10 + i)  * 8256) {
        printf("%d\n", i);
    }
}

这就是最简单的枚举算法。枚举算法的基本思想就是有序的去尝试每一种可能。

现在还有一个计算题 xxx + xxx = xxx,将1到9分别填入到9个x中,每个数字只能使用一次使得等式成立。试问一共有多少种合理的组合呢:

#include 

int main()
{
    int a, b, c, d, e, f, g, h, i, total = 0;
    for (a = 1; a <= 9; a++)
        for (b = 1; b <= 9; b++)
            for (c = 1; c <= 9; c++)
                for (d = 1; d <= 9; d++)
                    for (e = 1; e <= 9; e++)
                        for (f = 1; f <= 9; f++)
                            for (g = 1; g <= 9; g++)
                                for (h = 1; h <= 9; h++)
                                    for (i = 1; i <= 9; i++) {
                                        if (a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && b != c && b != d && b != e && b != f && b != g && b != h && b != i && c != d && c != e && c != f && c != g && c != h && c != i && d != e && d != f && d != g && d != h && d != i && e != f && e != g && e != h && e != i && f != g && f != h && f != i && g != h && g != i && h != i && (a * 100 + b * 10 + c + d * 100 + e * 10 + f = g * 100 + h * 10 + i)) {
                                            total++;
                                            printf("%d%d%d + %d%d%d = %d%d%d\n",a, b, c, d, e, f, g, h, i);
                                        }
                                    }
    printf("total = %d", total / 2);
    return 0;
}

估计有人看见这段代码有想骂人的冲动。如果以后写代码都是这样,那么真的是太折磨了。还可以使用标记法来解决互不相等的问题:

#include 

int main()
{
    int a[10], i, total, book[10], sum;
    
    for (a[1] = 1; a[1] <= 9; a[1]++)
        for (a[2] = 1; a[2] <= 9; a[2]++)
            for (a[3] = 1; a[3] <= 9; a[3]++)
                for (a[4] = 1; a[4] <= 9; a[4]++)
                    for (a[5] = 1; a[5] <= 9; a[5]++)
                        for (a[6] = 1; a[6] <= 9; a[6]++)
                            for (a[7] = 1; a[7] <= 9; a[7]++)
                                for (a[8] = 1; a[8] <= 9; a[8]++)
                                    for (a[9] = 1; a[9] <= 9; a[9]++) {
                                        for (i = 1; i <= 9; i++) {
                                            book[i] = 0; // 初始化标记数组
                                        }
                                        
                                        for (i = 1; i <= 9; i++) {
                                            book[a[i]] = 1; // 如果某个数出现过了就标记一下
                                        }
                                        
                                        sum = 0;
                                        
                                        // 统计出现了多少个不同的数
                                        for (i = 1; i <= 9; i++) {
                                            sum += book[i];
                                        }
                                        
                                        // 如果出现了9个不同的数,并且满足条件,则输出
                                        if (sum == 9 && (a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] = a[7] * 100 + a[8] * 10 + a[9])) {
                                            total++;
                                            printf("%d%d%d + %d%d%d = %d%d%d\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);
                                        }
                                    }
    printf("total = %d", total / 2);
    
    return 0;
}

这个说实话还是很垃圾很坑人。

你可能感兴趣的:(C语言,c语言)