4.4 力扣|59螺旋矩阵II

原题链接:螺旋矩阵II4.4 力扣|59螺旋矩阵II_第1张图片

类型:模拟

解题过程:

错误代码:
#include
using namespace std;
    vector > generateMatrix(int n) {
        vector >mat(n,vector(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 > mat=generateMatrix( n);
		 for(int i=1;i<=n;i++){
		 for(int j=1;j<=n;j++){
		 	cout<
错因: 

 /*错因:混淆了一点,用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
using namespace std;
    vector > generateMatrix(int n) {
        vector >mat(n,vector(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 > mat=generateMatrix( n);
		 for(int i=0;i

总结:

1、模拟题,在纸上模拟一下过程,第一轮、第二轮......更快找到思路

2、边界的变化容易搞混,使用意义清晰的名字非常有必要

你可能感兴趣的:(矩阵,线性代数)