deepinlinux下C语言穷举解决9宫格填数字

偶然看到小学3年级数独题目

9宫格 从4到12,填入9宫格,使横竖和2个对角和都是24
    九宫格上各个位置数字都应不同即9个数字都要使用且不能重复使用,角位置的数字存在于3个等式中,边中点数字存在于2个等式中,中心数字存在于4个等式中,由此猜想若是将3个不同数相加等于24的各个等式列出来-再看看每个数字可存在的等式数量,依据各位置数字存在规律 不就可以找到匹配了吗?
    可先确定“8是中心数字,4 10 12是边中点数字”
    8在中心位置 4 和12在同一直线的边中点位置 10在不同直线
    一条线上已确定8 10 还差一个数-等于24 所以该线上剩余数是6
    2个中点有4和6,可以确定角上11,然后其他的就简单了

题目本身算是结束了,但身为it人员,自然要用计算机高效解决一下的,来一段c语言吧

#include 
//数独游戏穷举结果
void sudoku(int m, int val, int n, int value) {
    printf("hello world\n Harmony is coming!\n");
    int i[] = { 0, 0, 5, 6, 0, 0, 0, 0, 0 };
    for (i[0] = 4;i[0] < 13;i[0]++) {
        for (i[1] = 4;i[1] < 13;i[1]++) {
            do {
                if (m == 2) {
                    i[2] = val;
                }
                else {
                    i[2]++;
                }
                do {
                    if (n == 3) {
                        i[3] = value;
                    }
                    else {
                        i[3]++;
                    }
                    for (i[4] = 4;i[4] < 13;i[4]++) {
                        for (i[5] = 4;i[5] < 13;i[5]++) {
                            for (i[6] = 4;i[6] < 13;i[6]++) {
                                for (i[7] = 4;i[7] < 13;i[7]++) {
                                    for (i[8] = 4;i[8] < 13;i[8]++) {
                                        if (i[0] + i[1] + i[2] == 24 && i[3] + i[4] + i[5] == 24 && i[6] + i[7] + i[8] == 24 && i[0] + i[3] + i[6] == 24
                                            && i[1] + i[4] + i[7] == 24 && i[2] + i[5] + i[8] == 24 && i[0] + i[4] + i[8] == 24 && i[2] + i[4] + i[6] == 24) {
                                            printf("%2d %2d %2d \n", i[0], i[1], i[2]);
                                            printf("%2d %2d %2d \n", i[3], i[4], i[5]);
                                            printf("%2d %2d %2d \n", i[6], i[7], i[8]);
                                            gchar ch[50];
                                            sprintf(ch, "%2d %2d %2d   %2d %2d %2d   %2d %2d %2d", i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8]);
                                            gtk_entry_set_text(entry3, ch);
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                } while (i[3] < 13 && n != 3);
            } while (i[2] < 13 && m != 2);
        }
    }
}
void samplesudoku(int m, int val, int n, int value) {
    clock_t start, finish;
    start = clock();
    sudoku(m, val, n, value);
    finish = clock();
    printf("sudoku is cool!  %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC);
}
G_MODULE_EXPORT void on_btn_sudoku_clicked()
{
    getnum();
    if (nx == 5 && nz == 6) {
        samplesudoku(2, 5, 3, 6);
    }
    else if (nx == 7 && nz == 4) {
        samplesudoku(2, 7, 3, 4);
    }
    else if (nx == 9 && nz == 12) {
        samplesudoku(2, 9, 3, 12);
    }
    else if (nx == 11 && nz == 10) {
        samplesudoku(2, 11, 3, 10);
    }
    else {
        gchar ch[50];
        sprintf(ch, "suggest:(5,6)(7,4)(9,12)(11,10)");
        gtk_entry_set_text(entry3, ch);
    }
}

将这段代码嵌入我C语言gtk组件的样例程序,打印了时间,毫秒级,好棒,计算机促进人变懒了,不用思考那么多的复杂逻辑了。

你可能感兴趣的:(linux,c,算法,c)