menu 首页 标签 归档 作品集 关于
算法-蛇形填数

一言加载中...

Snake num
思路:

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

1
2
3
4
5
//加头文件
#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变量:

1
int i=0,j=n-1;

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

snake num

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

1
2
3
4
5
6
7
8
9
//从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;

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;

int main()
{
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)
{
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;
}
//输出
for (i=0; i<n; ++i)
{
for (j=0; j<n; ++j)
{
cout<<setw(3)<<a[i][j];
}
cout<<endl;
}
}

20171014155952317.png

结束:
Tony-Chen
2017.10.14

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

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

评论

arrow_upward