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
原创粉丝点击