旋转矩阵
旋转的方式把数字一个接一个写入矩阵中。
这时需要用到循环不变量,它是一个循环,每次处理的时候需要处理的方式是一样的,而不是有着条件的限制。
对于这道题,循环不变量就是边元素的处理,只处理当前边的起始元素,不处理当前边的末尾元素。
对于奇数矩阵还是偶数矩阵,只是多加一个元素指定值。
调试之后,发现自己欠缺考虑有几点。
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;
}