求输出下面魔方阵结果的代码,该如何处理
求输出下面魔方阵结果的代码
求输出下面结果的代码
17 16 15 14 13
18 5 4 3 12
19 6 1 2 11
20 7 8 9 10
21 22 23 24 25
不知道看明白没有?
------解决方案--------------------
抛砖引玉:
求输出下面结果的代码
17 16 15 14 13
18 5 4 3 12
19 6 1 2 11
20 7 8 9 10
21 22 23 24 25
不知道看明白没有?
------解决方案--------------------
抛砖引玉:
- C/C++ code
#include <stdio.h> #define N 6 #define IFNZERO(xx) if((xx)==0) (xx) int main() { int i,j,m; int a[N][N]; for(j = 0; j < N; j++) for(i = 0; i < N; i++) a[i][j] = 0; for(i = 0; i <= N/2; i++){ m = N-i*2-1; IFNZERO(a[i][i]) = m*m+1; IFNZERO(a[N-i-1][N-i-1]) = (N-i*2)*(N-i*2); for(j = i+1; j < N-i; j++) { IFNZERO(a[j][i]) = a[j-1][i]-1; IFNZERO(a[N-j-1][N-i-1]) = a[N-j][N-i-1]-1; IFNZERO(a[i][j]) = a[i][j-1]+1; } for(j = i+1; j < N-i; j++) IFNZERO(a[N-i-1][j]) = a[N-i-1][j-1]-1; } if(!(N&1)) { /* 若N为偶数 */ for(i = 0; i < N/2; i++) for(j = 0; j < N; j++){ m = a[i][j]; a[i][j] = a[N-1-i][N-1-j]; a[N-1-i][N-1-j] = m; } } for(j = 0; j < N; j++){ for(i = 0; i < N; i++) printf("%-4d", a[i][j]); printf("\n"); } return 0; }
------解决方案--------------------
这个是我的,代码行比较多,不过逻辑很简单
- C/C++ code
#include <stdio.h> void main(void){ int direct = 0; // 移动方向:0 右 1 上 2 左 3 下 int count = 5; // 要打印数的行数和列数 int x=0,y=0; int mofang[5][5] = {0}; x = y = count/2; // 中心坐标 mofang[x][y] = 1; for(int i=2; i<count*count+1; i++){ if(direct == 0){ int tx = x + 1; int ty = y; if(mofang[tx][ty] == 0){ mofang[tx][ty] = i; }else{ direct = 3; i--; continue; } x ++; direct = 1; } else if(direct == 1){ int tx = x; int ty = y - 1; if(mofang[tx][ty] == 0){ mofang[tx][ty] = i; }else{ direct = 0; i--; continue; } y --; direct = 2; } else if(direct == 2){ int tx = x - 1; int ty = y; if(mofang[tx][ty] == 0){ mofang[tx][ty] = i; }else{ direct = 1; i--; continue; } x --; direct = 3; } else if(direct == 3){ int tx = x; int ty = y + 1; if(mofang[tx][ty] == 0){ mofang[tx][ty] = i; }else{ direct = 2; i--; continue; } y ++; direct = 0; } } for(int n=0; n<count; n++){ for(int m = 0; m<count; m++){ printf("%d ",mofang[m][n]); } printf("\n"); } }
------解决方案--------------------
我用循环没整出来,想了想用回朔做的,就一个while循环:
- C/C++ code
/* magic square V2.0 ZhongWeilin, Oct 17th, 08 */ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define LEN 5 void print(int a[LEN][LEN]); void main() { int a[LEN][LEN]; memset(a, 0, LEN*LEN*sizeof(int)); print(a); for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { printf("%3d", a[i][j]); } printf("\n"); } system("pause"); } void print(int a[LEN][LEN]) { //int init_pos1, initpos2; //记录初始位置 int flag; //作为判断是否回退的标志 int i, j; //循环变量 int data = 1; //数据值 int flag_add; //增长方向(增加或减少) int flag_row; //生长方向(行或列) //int flag_offset; /*初始化*/ a[2][2] = data; a[2][3] = ++data; i = 2; j = 3; flag = 1; flag_add = 0; flag_row = 1; //flag_offset = 1; while(i<5 && j<5) { if(i==j && i<LEN/2) //增长方向判断 { flag_add = 1; flag_row = 1; } if(i==j && i>LEN/2) //往外一圈 { ++flag; a[i][++j] = ++data; flag_add = 0; //重置 flag_row = 1; } if(i!=j && abs(i-2)==abs(j-2)) flag_row = (flag_row ==1)?0:1; /*列的赋值*/ if(!flag_row) { if(abs(i-2) != flag) //控制在邻圈内 { if(flag_add) --j; else ++j; --data; } else { if(flag_add) a[i][++j] = ++data; else a[i][--j] = ++data; } } else { /*行的赋值*/ if(abs(j-2) != flag) //控制在邻圈内 { if(flag_add) --i; else ++i; --data; } else { if(flag_add) a[++i][j] = ++data; else a[--i][j] = ++data; } } } ////////////////////////////////////////////////////////////////// }