c语言:实现奇数阶魔方阵
来源:互联网 发布:96台海战争知乎 编辑:程序博客网 时间:2024/06/07 14:47
奇数阶魔方阵算法:
1.将第一行中间一列赋值为数值1;
2.以此进行行数减1,列数加1;
3.如果行数的下一行小于0,则将行数设置为n-1;
4.如果列数的下一列大于阶数n,则将列数设置为0;
5,如果按照上述进行后该行列处有数,则将该数放到该列的下面一行。
一、基本实现代码如下: (没用到数据结构的知识,用了最基本的二维数组。)
int _tmain(int argc, _TCHAR* argv[]){int array[N][N] = { 0 };int i = 0;int j = N / 2;array[i][j] = 1;for (int a=2;a<=N*N;a++){ i = i - 1;j = j + 1;if ((i<0) && (j == N)){i = i + 2;j = j - 1;}else{if (i < 0){i = N - 1;}if (j > N - 1){j = 0;}}if (array[i][j] == 0){array[i][j] = a;}else{i = i + 2;j = j - 1;array[i][j] = a;}}for (i = 0; i < N; i++){ for (j = 0; j < N; j++){cout << array[i][j] << " ";}cout << endl;} return 0;}二、用数据结构里面的定义的二维数组实现,其算法都一样
<p><pre name="code" class="cpp">#include<iostream>#include<stdio.h>#include<iomanip>using namespace std;typedef struct{int *base;int b1, b2;}Array;//函数声明void Error(char *s); //错误处理函数void Init_Array(Array &a, int m, int n); //初始化一个m行n列的数组void Destroy_Array(Array &a); //销毁一个数组int Value_Array(Array &a, int &e, int m, int n); //取值操作实现void Assig_Array(Array &a, int &e, int m, int n); //数组赋值实现void Oddn_Magic(Array &a, int m, int n); //奇数阶魔方阵的填数void Print_Array(Array &a, int m, int n); //奇数阶魔方阵的输出函数//函数定义void Error(char *s) //错误处理函数{cout << s << endl;exit(1);}void Init_Array(Array &a, int m, int n) //初始化一个m行n列的数组{a.base = new int[m*n];if (!a.base)Error("内存申请失败!");a.b1 = m;a.b2 = n;for (int i = 0; i < m; i++){int b = 0;for (int j = 0; j < n; j++){Assig_Array(a, b, i, j);}}}void Destroy_Array(Array &a) //销毁一个数组{delete[] a.base;a.b1 = 0;a.b2 = 0;}int Value_Array(Array &a, int &e, int i, int j) //取值操作实现{if ((0 <= i) && (i < a.b1) && (0 <= j) && (j < a.b2)){int off = a.b2*i + j;e = a.base[off];}elseError("输入参数错误!");return e;}void Assig_Array(Array &a, int &e, int i, int j) //数组赋值实现{if ((0 <= i) && (i < a.b1) && (0 <= j) && (j < a.b2)){int off = a.b2*i + j;a.base[off] = e;}elseError("输入参数错误!");}void Oddn_Magic(Array &a, int m, int n) //奇数阶魔方阵的填数,右下斜行法,类似与左上斜行法{int i = 0;int j = n/ 2;int b = 1;int e = 0;Assig_Array(a, b, i, j); //将第0行中间一列的元素设置为1for (int c = 2; c <= m*n; c++) {i = i - 1;//行数减1j = j + 1; //列数加1if ((i<0) && (j == n)){i = i + 2;j = j - 1;}else{if (i < 0) //若行数小于0,则将行数设置为m-1{i = m- 1;}if (j > n- 1) //若列数大于n-1,则将列数设置为0{j = 0;}}if (Value_Array(a, e, i, j) == 0) //判断该行该列是否已经填有数{ Assig_Array(a, c, i, j);}else //若该行该列有数,则将该元素放到上一个元素的下面{ i = i + 2;j = j - 1;Assig_Array(a, c, i, j);}}}void Print_Array(Array &a, int m, int n) //奇数阶魔方阵的输出函数{int e = 0;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){cout <<setiosflags(ios_base::left)<<setw(6)<<Value_Array(a, e, i, j); //设置对齐方式和输出流宽度}cout << endl;}}int _tmain(int argc, _TCHAR* argv[]){Array A;int p = 0;cout << "请输入魔方阵阶数(只能为奇数):";cin >> p;Init_Array(A, p, p);Oddn_Magic(A, p, p);Print_Array(A, p, p); return 0;}
0 0
- c语言:实现奇数阶魔方阵
- c语言奇数阶魔方阵的实现
- 奇数阶魔方阵
- 奇数阶魔方阵
- 奇数阶魔方阵!
- C语言实现魔方阵
- 奇数魔方阵的实现
- 奇数阶魔方阵问题
- 【2041】奇数阶魔方阵
- 魔方阵算法及C语言实现
- 魔方阵算法及C语言实现
- 魔方阵算法及C语言实现
- c语言实现魔方阵算法
- 魔方阵的实现 C语言
- 魔方阵的实现(C语言)
- C语言魔方阵
- C语言 打印5阶魔方阵
- 编写程序实现n阶(n为奇数)魔方(C)
- Java内部类和泛型
- 斐波那契数列取模(大数)分治算法
- VideoView 官方
- python的函数
- jquery.post()
- c语言:实现奇数阶魔方阵
- nginx reload报错
- [bzoj2440][zsoi2011]完全平方数
- 赛码网OJ题——9 不可摸数 (1999)
- 获取一个数组中最长的连续的元素序列。例如,给定了[31,6,32,1,3,2],最长的连续的元素序列是[1,2,3],返回其长度3
- 检测nginx配置是否正确的方法
- DDNS更新 (3322和花生壳)
- 【leetcode】66. Plus One
- bfs 广度优先搜索