力扣59 螺旋矩阵

1、注意区间:我写的是每一次都留最后一个元素下次处理。左闭右开。

2、每次先遍历完一圈再遍历下一圈。用sx来记录 每一圈要走多少步。用 turn来记录这次应该往哪走了。

比如n=4 turn=0,sx=2时,那么最外面一圈要走两步(两步要包括在开始不用走的那个位置也就是 1  2  3写好了)

之后turn=1,再竖着写....

之后一圈完了的时候(如果此时sx>=0 就进行下一圈),此时i多减了1,此时应该 i+1,j+1(这样才是下一圈开始的位置),还要注意sx-=2;因为一圈之后两边界都缩小了1。此时turn又从0开始

继续转圈。直到sx<0,结束。并且要判断如果是奇数的话,最中心的数要加上。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>vec(n);  //创建一个二维vector<int>,有n行
        int a[21][21];
        memset(a,0,sizeof(a));
        int i,j,k;
        int sx=n-2;    //走几步
        int x=0;
        int turn=0;
        int sum=1;
        i=j=0;
        if(n==1)
        {
             vec[0].push_back(1);
             return vec;
        }
        while(1){
            if(turn==0){ //往右走
                for(k=0;k<=sx;k++)
                    a[i][j++]=sum++;
                if(sum>n*n)
                  break;
                turn=1;
            }
            if(turn==1){
                for(k=0;k<=sx;k++){
                    a[i++][j]=sum++;
                }
                turn =2;
            }
            if(turn==2){
                for(k=0;k<=sx;k++){
                    a[i][j--]=sum++;
                }
                turn=3;
            }
            if(turn==3){
                for(k=0;k<=sx;k++){
                    a[i--][j]=sum++;
                }
                turn=0;
            }
            sx-=2;
            if(sx<0)
            break;
            i+=1;
            j+=1;
        }
        if(sx<0)
        {
            if(n%2)
            a[i+1][j+1]=sum;
        }
        int t=0,p=0;
        for(i=0;i<=n-1;i++){
            for(j=0;j<=n-1;j++)
            {
                vec[i].push_back(a[i][j]);
               // cout<<a[i][j]<<" ";
            }
            //cout<<endl;
        }
        return vec;
    }
};

 

posted @ 2023-03-16 13:36  我的秘密小屋  阅读(17)  评论(0)    收藏  举报