题目描述:
给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
输入:
4
输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解题代码:
#include <iostream>
#include <iomanip>
using namespace std;
int a[100][100], n;
int main()
{
a[1][1] = 1;//初始为1
cin >> n;
for (int i = 1, j = 1, num = 1; num < n * n;) //此处不能是num <=n * n,不能加等号的原因
是:
//n*n是最后一个数,周围都是数字,加等号后无
法跳出循环
{ //一直填到n*n个数填完
while (++j <= n && !a[i][j]) //!a[i][j]判断数组是否有数
] {
a[i][j] = ++num;
}
--j;//向右填充数组
while (++i <= n && !a[i][j])
{
a[i][j] = ++num;
}
--i;//向下填充数组
while (--j > 0 && !a[i][j])
{
a[i][j] = ++num;
}
++j;//向左填充数组
while (--i > 0 && !a[i][j])
{
a[i][j] = ++num;
}
++i;//向上填充数组
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cout << setw(3) << a[i][j];//输出
}
cout << endl;
}
return 0;
}
简洁版
# include <iostream>
# include <iomanip>
using namespace std;
int a[10][10];
int main()
{
int n;
cin >> n;
a[1][1] = 1;
for(int i=1,j=1,num=1;num<n*n;)
{
while (++j <= n && !a[i][j]) a[i][j] = ++num; --j;
while (++i <= n && !a[i][j]) a[i][j] = ++num; --i;
while (--j >= 1 && !a[i][j]) a[i][j] = ++num; ++j;
while (--i >= 1 && !a[i][j]) a[i][j] = ++num; ++i;
}
for(int i=1;i<=n;i++)
{
for (int j = 1;j<=n;j++)
{
cout << setw(3) << a[i][j];
}
cout << endl;
}
return 0;
}