题目概述:
给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
思路:
用掉两个数组,一个用来标记,一个存储数据,现将边界标记TRUE(表示已经使用,便于边界处理和拐弯)。
细节看代码注释:
代码:
#include <iostream>
const int N = 12;
int a[N][N];
bool b[N][N];
using namespace std;
int main(void)
{
int n, i =1, j = 1,m;
cin >> n;
m = n;
for(int i = 0; i <= n + 1; i++){ //标记边界
b[0][i] = true; b[n+1][i] = true;
b[i][0] = true; b[i][n+1] = true;
}
n = n * n;
int k = 1;
while(1){
while(!b[i][j]){ //右移
a[i][j] = k++;
b[i][j++] = true;
}
j--; i++; //越界处理
while(!b[i][j]){ //下移
a[i][j] = k++;
b[i++][j] = true;
}
i--; j--; //越界处理
while(!b[i][j]){ //左移
a[i][j] = k++;
b[i][j--] = true;
}
j++; i--; //越界处理
while(!b[i][j]){ //上移
a[i][j] = k++;
b[i--][j] = true;
}
i++;j++; //越界处理
if(k > n)
break;
}
for(int i = 1; i <= m; i++){ //输出
for(int j = 1; j <= m; j++)
printf("%3d",a[i][j]);
cout << endl;
}
return 0;
}