利用左斜行法 解决九宫格问题
九宫格问题 :在5*5的格子中填入1-25之间的数,使其每行每列以及对角线和相等
如图所示:
下面代码写的是9*9的九宫格
#include<stdio.h> #include<stdlib.h> int x, y; int array[9][9] = { 0 }; //判断是否为第一列 //当y == 0 时,是第一列,返回值为1;否则返回值为0 int Is_FirstList() { if (0 == y) { return 1; } return 0; } //判断是否为最后一行 //当x == 8时,是最后一行,返回值为1;否则返回值为0 int Is_LastLine() { if (8 == x) { return 1; } return 0; } //判断斜下方是否填充了数 //如果没有填充,则返回1,说明该向这个位置填充了 //否则,返回0,说明此时需要向上方填充 int Underneath() { if (0 == array[x + 1][y - 1]) { return 1; } return 0; } int main() { y = 9 / 2; x = 8; //设置开始点,也就是1的位置 int nNum = 1; for (nNum = 1; nNum <= 9 * 9; nNum++) { //是最后一行但不是第一列,则从前一列的第一行开始 if (Is_LastLine() && !Is_FirstList()) { array[x][y] = nNum; x = 0; y--; continue; } //不是最后一行但是第一列,则从下一行的最后一列开始 if (!Is_LastLine() && Is_FirstList()) { array[x][y] = nNum; x++; y = 8; continue; } //不是最后一行也不是第一列,则从左斜下方开始 if (!Is_LastLine() && !Is_FirstList()) { if (Underneath())//斜下方为空,填充 { array[x][y] = nNum; x++; y--; } else //斜下方不为空,则向上填充 { array[x][y] = nNum; x--; } continue; } //最后一行第一列,则向上填充 if (Is_LastLine() && Is_FirstList()) { array[x][y] = nNum; x--; continue; } } int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { printf("%5d", array[i][j]); printf(" "); } printf("\r\n"); } system("pause"); return 0; }