偶然看到小学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组件的样例程序,打印了时间,毫秒级,好棒,计算机促进人变懒了,不用思考那么多的复杂逻辑了。