首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求输出下面魔方阵结果的代码,该如何处理

2012-03-02 
求输出下面魔方阵结果的代码求输出下面结果的代码17 16 15 14 1318 543 1219 612 1120 789 1021 22 23 24

求输出下面魔方阵结果的代码
求输出下面结果的代码

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 5void 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;            }        }    }    //////////////////////////////////////////////////////////////////} 


[解决办法]

C/C++ code
#include <stdio.h>#define N 5//阶层mai(){ int a[N][N]; int x,y,i,j,k,m=1;//x纵坐标,y 横坐标,k为显示数据,m为控制走向x(y)的上(下)左(右)走动的台阶数, x=N/2;            //初始化x坐标 y=N%2?x:x-1;//查阶层是偶(奇)数,初始化y坐标 k=1;//初始化显示数据 a[x][y]=k//初始化赋值    while(k<=N*N)   {      for(i=0;i<=m;i++)        {         y+=m%2?1:-1;//(查左右走动)         k++;         a[x][y]=k;          if(k>=N*N)break;//时时查获 k的值,         }     if(k>=N*N)break;//时时查获 k的值       for(i=0;i<=m;i++)        {        x-=m%2?1:-1;//(查上下)        k++;        a[x][y]=k;                }     m++;//走回一楼自加到二楼              }  for(i=0;i<N;i++)//显示结果   {  for(j=0;j<N;j++)       printf("%4d",a[i][j]);    printf("\n");printf("\n");    }   } 

热点排行