4.4 力扣|59螺旋矩阵II
原题链接:螺旋矩阵II
类型:模拟
解题过程:
错误代码:
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > generateMatrix(int n) {
vector<vector<int> >mat(n,vector<int>(n));
int t=1;//填充的数字从1开始
int x=1,y=n;
//先考虑填满外圈
while(t<=n*n){
for(int i=x;i<=n;i++){
mat[x][i]=t;//上圈,第一行的每个
t++;
}
for(int i=x;i<=n;i++){
mat[i][y]=t;t++;//右圈,第n列的每个
}
for(int i=x;i<=n;i++){
mat[y][i]=t;t++;//下圈
}
for(int i=x;i<=n;i++){
mat[i][x]=t;t++;
}
x++;
n--; }
return mat;
}
int main(){
int n;cin>>n;
vector<vector<int> > mat=generateMatrix( n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<mat[i][j];
}
cout<<'\n';}
return 0;
}
错因:
/*错因:混淆了一点,用x,y代表了所有的边界,错误
第一轮,
上:x=1,y=n
右:x=2,y=n
下:x=n-1,y=1
左:x=n-1,y=1
第二轮:
上:x=2,y=n-1
右:x=3,y=n-1
下:x=n-2,y=2
左:x=n-2,y=2
所以,上下可以用同一组来表示,左右可以用同一组表示,两组*/
修正:
//修正:
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > generateMatrix(int n) {
vector<vector<int> >mat(n,vector<int>(n));
int t=1;//填充的数字从1开始
int top=0,bottom=n-1,left=0,right=n-1;
//分别代表:上边界的行数、下边界的行数、左边界的列数、右边界的列数
//先考虑填满外圈,每次都相当于填满外圈,只不过是边界不同
while(t<=n*n){
for(int i=left;i<=right;i++){
mat[left][i]=t;t++;//上圈
} top++;
for(int i=top;i<=bottom;i++){
mat[i][right]=t;t++;//右圈
} right--;
for(int i=right;i>=left;i--){
mat[bottom][i]=t;t++;//下圈
} bottom--;
for(int i=bottom;i>=top;i--){
mat[i][left]=t;t++;//左圈
} left++;
}
return mat;
}
int main(){
int n;cin>>n;
vector<vector<int> > mat=generateMatrix( n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<mat[i][j]<<" ";
}
cout<<'\n';}
return 0;
}
总结:
1、模拟题,在纸上模拟一下过程,第一轮、第二轮......更快找到思路
2、边界的变化容易搞混,使用意义清晰的名字非常有必要