利用ACwing 756 蛇形矩阵的方法:
下方是756的题解,
https://www.acwing.com/solution/content/29599/
思路和蛇形矩阵差不多,用t作为输出结果,当方向向量d=1的时候,t自增,呈环形输出结果,使用到了二维数组知识点
#include <iostream>
using namespace std;
const int N = 110;
int q[N][N];
int main()
{
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}, n;
while ( cin >> n , n ){
int x = 0, y = -1, d = 1, t = 1;
// 按环形将数值输入到二维数组中
for (int i = 0; i < n * n; i ++ )
{
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= n || q[a][b])
{
d = (d + 1) % 4;
if ( d == 1) t ++;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
q[x][y] = t;
}
// 输出结果
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ ){
cout << q[i][j] << ' ';
}
cout << endl;
}
cout << endl;
// 下方初始化数组
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
q[i][j] = 0 ;
}
}
return 0;
}
yxc方法,更加巧妙:
求当前二维位置到顶部、到底部、到最左边、到最右边的最小值,逐个填充,但是没有使用到二维数组的知识。
#include <iostream>
using namespace std;
int main()
{
int n ;
while ( cin >> n , n != 0){
for ( int i = 0 ; i < n ; i ++){
for ( int j = 0 ; j < n ; j ++){
int up = i + 1 , down = n - i , left = j + 1 , right = n - j ;
cout << min(min(up ,down), min ( left ,right)) << " " ;
}
cout << endl;
}
cout << endl;
}
return 0;
}