解题思路
2024-05-24 23:23:53
发布于:上海
思路:
创建一个 n x n 的二维矩阵,并将所有元素初始化为 0。
初始化四个变量:top、bottom、left 和 right,以表示矩阵的边界。
从矩阵的左上角开始,向右移动,依次填充元素(1, 2, 3,...)。
当达到右边界时,向下移动,依次填充元素。
当达到下边界时,向左移动,依次填充元素。
当达到左边界时,向上移动,依次填充元素。
重复步骤 3-6,直到矩阵中的所有元素都被填充。
公式:
让 matrix[i][j] 表示矩阵中第 i 行第 j 列的元素。让 num 是当前要填充到矩阵中的数字。
填充矩阵元素的公式是:
matrix[top][left] = num; num++;(向右移动)
matrix[top][left + 1] = num; num++;(向右移动)
3....
matrix[top][right] = num; num++;(向下移动)
matrix[top + 1][right] = num; num++;(向下移动)
6....
matrix[bottom][right] = num; num++;(向左移动)
matrix[bottom][right - 1] = num; num++;(向左移动)
9....
matrix[bottom][left] = num; num++;(向上移动)
matrix[bottom - 1][left] = num; num++;(向上移动)
12....
循环继续,直到矩阵中的所有元素都被填充。
伪代码:
函数 generateSpiralMatrix(n)
创建一个 n x n 的二维矩阵
top = 0; bottom = n - 1; left = 0; right = n - 1
num = 1
当 top <= bottom 且 left <= right
对于 i 从 left 到 right
matrix[top][i] = num; num++
top++
对于 i 从 top 到 bottom
matrix[i][right] = num; num++
right--
如果 top <= bottom
对于 i 从 right 到 left
matrix[bottom][i] = num; num++
bottom--
如果 left <= right
对于 i 从 bottom 到 top
matrix[i][left] = num; num++
left++
返回矩阵
#include <iostream>
#include <vector>
using namespace std;
void printSpiralMatrix(int n) {
vector<vector<int>> matrix(n, vector<int>(n));
int num = 1;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) {
matrix[top][i] = num++;
}
top++;
for (int i = top; i <= bottom; i++) {
matrix[i][right] = num++;
}
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) {
matrix[bottom][i] = num++;
}
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) {
matrix[i][left] = num++;
}
left++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
int main() {
int n;
cin >> n;
printSpiralMatrix(n);
return 0;
}
全部评论 3
#include<iostream> using namespace std; int n,A[102][102]={},a[4]={-1,0,1,0},b[4]={0,1,0,-1},sum=2,x=1,y=1; int main(){ cin>>n; A[1][1]=1; for(int i=1;sum<=n*n;i++){ while(A[x+a[i%4]][y+b[i%4]]==0&&x+a[i%4]<=n&&y+b[i%4]<=n&&x+a[i%4]>0&&y+b[i%4]>0){ x+=a[i%4]; y+=b[i%4]; A[x][y]=sum++; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<A[i][j]<<" "; }cout<<endl; } }
2024-07-23 来自 浙江
0?
2024-07-23 来自 上海
0一个while多好使
2024-07-28 来自 浙江
0
?不是这易如反掌的题还要用ChatGPT(
2024-05-25 来自 广东
0我不太会
2024-05-25 来自 上海
0
6
2024-05-25 来自 广东
0
有帮助,赞一个