算法之美--2.3.3九宫格问题

2016-12-13   00:28:19
在《射雕英雄传》中黄蓉曾破解九宫格,口诀:戴九履一,左三右七,二四有肩,八六为足,五居中央。
还有口诀:“一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样。” 这口诀不仅适用于九宫,也适用于推广的奇数九宫,如五五图,七七图等等.
 
「重排九宫」有两种玩法:
第一种是在在3×3方格盘上,是把1至8八个小木块随意摆放,每一空格其周围的数字可移至空格。玩者要将小木块按12345678的顺序重新排好,以最少的移动次数拼出结果者为胜。
第二种玩法如九宫格算术游戏玩法,推动木格中8个数字排列,横竖都有3个格,使每行、每列两个对角线上的三数之和都等于15。在计算的同时,还必须思考怎么把数字方块推动到相对应的位置上,这个游戏不仅仅考验人的数字推理能力,也同时考验了人的思维逻辑能力。

  针对奇数阶数的幻方填写方法:

注意:二维数组指针的创建和释放。

v
/*!
 * file 九宫格问题.cpp
 *
 * author ranjiewen
 * date 十二月 2016
 *
 * 
 */

#include<iostream>
#include<iomanip>

using namespace std;

int main(int agrc, char **argv[])
{
    cout << "请输入幻方的小大n(大于1的奇数):" << endl;
    int n = 1;
    cin >> n;
    cout << endl;
    int **a = new int*[n];
    for (int i = 0; i < n;i++)
    {
        a[i] = new int[n];
        memset(a[i],0,n*sizeof(int));
    }
    int row = 0;
    int col = n / 2;

    for (int i = 1; i <= n*n;i++)
    {
        a[row][col] = i;
        row--;
        col++;
        if (row<0&&col>=n)
        {
            col--;
            row += 2;
        }
        else if (row < 0)
        {
            row = n - 1;
        }
        else if (col>=n)
        {
            col = 0;
        }
        else if (a[row][col]!=0)
        {
            col--;
            row += 2;
        }
    }

    for (int i = 0; i < n;i++)
    {
        for (int j = 0; j < n;j++)
        {
            cout << setw(6) << a[i][j];
        }
        cout << endl;
    }
    for (int i = n-1; i >0 ; i--)
    {
        delete[] a[i];
    }
    delete[] a;

    return 0;
}
原文地址:https://www.cnblogs.com/ranjiewen/p/6168218.html