利用左斜行法 解决九宫格问题

九宫格问题 :在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;
}

 

posted on 2017-12-11 22:34  秋雨丶梧桐  阅读(861)  评论(0编辑  收藏  举报

导航