码迷,mamicode.com
首页 > 其他好文 > 详细

回型矩阵的走法

时间:2019-10-02 22:35:46      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:中心   color   大小   一段   代码   简单   std   alt   div   

  不说废话,先上图

技术图片

实现这个目标,可以把数字想像成一条蛇,蛇爬过的数字就加一。把二维数组[y][x]作为地图,y为纵轴,x为横轴。通过改变蛇的坐标让它爬起来(是不是很像贪吃蛇)。!!先上总代码:

#include <stdio.h>
//地图(数组)和坐标位置
int map[100][100];
int x = 0, y = 0;

//蛇的前进方向(步数)
void up(int);
void down(int);
void left(int);
void right(int);

//蛇走一步留下一个数字
int num = 0;

void up(int step) {
    int i;
    for(i=0;i<step;i++)//向上走多少步数
    {
        num++;
        map[y--][x] = num;
    }
}
void down(int step) {
    int i;
    for (i = 0; i < step; i++)//向下走多少步数
    {
        num++;
        map[y++][x] = num;
    }
}
void left(int step) {
    int i;
    for (i = 0; i < step; i++)//向左走多少步数
    {
        num++;
        map[y][x--] = num;
    }
}
void right(int step) {
    int i;
    for (i = 0; i < step; i++)//向右走多少步数
    {
        num++;
        map[y][x++] = num;
    }
}


int main()
{    
    //自定义矩阵大小n*n
    int size;
    printf("请输入你想要的矩阵边长大小(n):"); 
    scanf("%d",&size); 
    
    //蛇开始爬动 
    int step;
    if(size%2==1)//size为奇数 
    {
        for(step=size-1;step>0;step-=2){
        right(step);
        down(step);
        left(step);
        up(step);
        x++,y++;//走完一圈后,从右边第一格再走 
        }
        //最后蛇再爬到中心位置
        int middle=(size-1)/2;
        map[middle][middle]=++num; 
    }
    if(size%2==0)//size为偶数 
    {
        for(step=size-1;step>0;step-=2){
        right(step);
        down(step);
        left(step);
        up(step);
        x++,y++;//走完一圈后,从右边第一格再走 
        }
    }

    //打印出效果 
    int i,j;
    for (i = 0;i < size; i++) {
        for (j = 0; j < size; j++) {
            printf(" %3d ", map[i][j]);
        }
        printf("\n");
        printf("\n");
    }
    
    return 0;
}

  这些都挺简单的对吧,关键是怎么让蛇在我们希望时调头。在这我想先说说我发现的一些规律:
    (9^2-1)/4=20=2+4+6+8;    10^2/4=25=1+3+...+9;

    (11^2-1)/4=120=2+4+...+10;    12^2/4=36=1+3+...+11;

  对于奇数(a^2-1)/4=2+4+...+(a-1);  对于偶数(b^2)/4=1+3+...+(b-1);

  也许你会说这有什么用,别急,好戏还在后头。

  我们要围成n*n的正方形矩阵,正方形有4条边,正好对应上面的除以4,所以,你懂我意思把。

  以10*10为例,第一层每边走9步,第二层7步,第三层5步,第四层3步,第五层1步,这样就刚好把整个地图走完。

  这是不是和10^2/4=25=1+3+...+9很像。  

  对应如图:

技术图片

  这样我们就可以把每条边分成4段,走完一段后蛇就调头,一直爬到终点。

  有一点要注意的是,对于偶数的平方都能被4整除,蛇完整的走完循环。所以:

if(size%2==0)//size为偶数 
    {
        for(step=size-1;step>0;step-=2){
        right(step);
        down(step);
        left(step);
        up(step);
        x++,y++;//走完一圈后,从右边第一格再走 
        }
    }

  而对于奇数,平方后中间会剩下一个点。为了把它填满,奇数就是这样:

if(size%2==1)//size为奇数 
    {
        for(step=size-1;step>0;step-=2){
        right(step);
        down(step);
        left(step);
        up(step);
        x++,y++;//走完一圈后,从右边第一格再走 
        }
        //最后蛇再爬到中心位置
        int middle=(size-1)/2;
        map[middle][middle]=++num; 
    }

 

  最后希望我的方法能多少让你有些想法,谢谢。

 

回型矩阵的走法

标签:中心   color   大小   一段   代码   简单   std   alt   div   

原文地址:https://www.cnblogs.com/studyshare777/p/11618664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!