赞
踩
旋转矩阵
旋转的方式把数字一个接一个写入矩阵中。
这时需要用到循环不变量,它是一个循环,每次处理的时候需要处理的方式是一样的,而不是有着条件的限制。
对于这道题,循环不变量就是边元素的处理,只处理当前边的起始元素,不处理当前边的末尾元素。
对于奇数矩阵还是偶数矩阵,只是多加一个元素指定值。
调试之后,发现自己欠缺考虑有几点。
1.对于循环退出条件,没有考虑到,需要设置。
2.对于进入再次循环的条件,没有考虑到,具体体现在for循环中用到了n,而n是作为退出条件改变了。
3.对于奇数矩阵和偶数矩阵的处理,没有考虑到中间值。
4.定义二维矩阵。
以上4点,导致看了4次卡尔老师的代码,才完成。
vector<vector<int>> generateMatrix(int n) { // vector<vector<int>> vt; vector<vector<int>> vt(n, vector<int>(n, 0)); // 使用vector定义一个二维数组 int final = n; int start_x = 0; int start_y = 0; int offset = 1; int count =1; int loop = n; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理 int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2) int i ; int j ; while(n/2){ //处理圈的北边,i不动,j变大。 //因为每一条边不包括最后一个元素,所以会有n-offset。 for(j = start_y ; j< loop-offset ; j++){ vt[start_x][j]=count++; } //处理圈的东边,j不变,i变大。 for(i = start_x ; i< loop-offset ; i++){ vt[i][j] = count++; } //处理圈的南边,此时i,j皆为最大,但i不动,j变小。 for( j = j ;j >start_y; j --){ vt[i][j] = count++; } //处理圈的西边,此时j为最小,i逐渐变小。 for( i = i ; i > start_x ; i--){ vt[i][j] = count++; } start_x++; start_y++; offset++; n--; } if (final%2 ){ vt[mid][mid]=count; } return vt; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。