蛇形填数
题目描述:
输入N,输出如下的N*N蛇形填数正方形
解析:
想要输出如上的蛇形矩阵,首先分析从哪里开头,显然是a[0][n-1]。
接着模拟数字增加的走向,先是向下走,走到什么时候结束呢,此时有两种情况:
(1)走到边界即结束,此时应该退回一步(因为走到边界点的时候,又执行了一次自加操作),一个比较好的方法就是“预判”,也就是由判断上一个元素的下一个(其实就是本身)是否越界,如果不越界,就执行操作,否则即终止。因为在执行完上一次操作后,i的值还没有改变,也就是还停留在上一个元素,因此直接判断i+1<n是否成立既可以;
(2)遇到之前已经赋值的元素的位置即结束,和上面同理,也是判断a[i+1][j]是否非零就可以了。
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<Windows.h>
#include<cmath>
#define MAXN 100
using namespace std;
int main()
{
int i, j, n;
int a[MAXN][MAXN];
int cnt = 0;
cin >> n; //n*n的蛇形矩阵
memset(a, 0, sizeof(a));
a[i = 0][j = n - 1] = cnt = 1;
while (cnt < n*n)
{
while (i + 1 < n && !a[i + 1][j]) a[++i][j] = ++cnt;
while (j - 1 >= 0 && !a[i][j - 1]) a[i][--j] = ++cnt;
while (i - 1 >= 0 && !a[i - 1][j]) a[--i][j] = ++cnt;
while (j + 1 < n && !a[i][j + 1]) a[i][++j] = ++cnt;
}
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;j++)
printf("%-3d", a[i][j]);
printf("\n");
}
system("pause");
return 0;
}