menu 首页 标签 归档 视频 关于
算法-蛇形填数

一言加载中...

Snake num
思路:

输入n;
构建一个n*n的矩阵,初始化所有值为为0

//加头文件
#include<cstring>
//初始化数据
//a是数组指针,0是初始化值,sizeof(a) ,a数组的大小; 
memset(a,0,sizeof(a));

确定第一个元素的位置(这里是a[0][n-1])
给第一个值得位置赋值为1;
a[0][n-1]=1;
注意:
此时进行填数时,是从(0,n-1)的位置开始的,所以切记此时初始化i,j变量:

int i=0,j=n-1;

进行循环填数关键代码如下:

snake num

由上面分析图可知从最后一列向下进行填数,如果到达第n个位置,或者是遇到下一个值得内容不是0时,证明之前已经填过数了,结束当前循环填数;

//从a[0][n-1]=1;开始,如果i小于n-1 或者 a[0][n-1]下面(即a[1][n-1])不为0时,结束当前填数
//向下
while (i<n-1 && !a[i+1][j])   a[++i][j]=++flag;  
//向左
while (j-1>=0 && !a[i][j-1])  a[i][--j]=++flag; 
//向上 
while (i-1>=0 && !a[i-1][j])  a[--i][j]=++flag; 
//向右 
while (j<n-1 && !a[i][j+1])   a[i][++j]=++flag;

完整代码如下:

#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;

 int main()
 &#123;
    int n, i, j, flag=0;  
    cin>>n; 
    int a[n][n]; 
    //这句话就是将a[n][n]所有值赋为0;
    memset(a,0,sizeof(a));

    //这句话好玩
    //简单点就是
    // int i=0,j=n-1;
    // int a[i][j]=1;
    // int flag=1;
    flag=a[i=0][j=n-1]=1;

    //共有 n*n个空格,直到添的数字小于n*n时,填充完毕
    while(flag<n*n)
    &#123;
        while (i+1<n && !a[i+1][j])   a[++i][j]=++flag;  
        while (j-1>=0 && !a[i][j-1])  a[i][--j]=++flag;  
        while (i-1>=0 && !a[i-1][j])  a[--i][j]=++flag;  
        while (j+1<n && !a[i][j+1])   a[i][++j]=++flag;
    &#125;
     //输出
    for (i=0; i<n; ++i)  
    &#123;  
        for (j=0; j<n; ++j)  
        &#123;
            cout<<setw(3)<<a[i][j];  
        &#125;  
        cout<<endl;  
    &#125;     
 &#125;

20171014155952317.png

结束:
Tony-Chen
2017.10.14

人生本就多磨难,不经打击老天真。

写博客不易,请我喝杯咖啡?

评论

arrow_upward