回型矩阵的走法

Posted studyshare777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回型矩阵的走法相关的知识,希望对你有一定的参考价值。

  不说废话,先上图

技术图片

实现这个目标,可以把数字想像成一条蛇,蛇爬过的数字就加一。把二维数组[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; 
    

 

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

 

以上是关于回型矩阵的走法的主要内容,如果未能解决你的问题,请参考以下文章

在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。

[DP]矩阵的最小路径和

HihoCoder 1504 : 骑士游历 (矩阵乘法)

矩阵:模型抽象化 51nod1122

踩方格

杨辉三角求沿着矩阵走的路径有多少条