### P4924 [1007]魔法少女小Scarlet #### 1、初始化数组的代码 ```c++ int cnt = 0; //计数器 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] = ++cnt; ``` .... 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 15 17 18 .... #### 2、%02d的格式控制 ```c++ for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) printf("%02d ", res[i][j]); printf("\n"); } ``` #### 3、矩阵的旋转 我们模拟原位置(i,j)在第一象限,i>0,j>0 逆时针90度,到达的位置是: (-j,i) 顺时针90度,到达的位置是:(j,-i) 180度,到达的位置:(-i,-j) 想方法背下来: (1)1,3象限,i,j位置不变。 2,4象限,i,j对调 (2)1象限是正的,3象限全是负的 2象限x是负的,y是正的 4象限x是正的,y是负的 #### 4、矩阵的遍历 ```c++ //逆时针 for (int i = -r; i <= r; i++) for (int j = -r; j <= r; j++) f[x - j][y + i] = res[x + i][y + j]; //顺时针 for (int i = -r; i <= r; i++) for (int j = -r; j <= r; j++) f[x + j][y - i] = res[x + i][y + j]; ``` #### 5、临时的矩阵变量 防止出现自行覆盖的问题,采用的办法是做一个数组的拷贝,复制品。 ```c++ memcpy(res, f, sizeof f); ```