算法之美--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; }
C/C++基本语法学习
STL
C++ primer