分析:设原始矩阵为a,变换后的矩阵为b,对于第一种情况,元素a[i, j]旋转90度之后在b中的位置为b[j, n-i-1],n是矩阵大小。
同理可以找出2,3,4,6变换前后的映射关系,情形5需要两次变换而已。
读数据时用scanf读到/n会停止,可是我声明的是字符数组,所以/n会读到数组里,所以需要fgetc把/n忽略掉。
/* ID: yffbrav1 LANG: C TASK: transform */ #include <stdio.h> #include <stdlib.h> #define N 10 int main() { FILE *fin = fopen("transform.in", "r"); FILE *fout = fopen("transform.out", "w"); char arr[N][N], arrplus[N][N]; int n, i, j, k; int flag; fscanf(fin, "%d", &n); fgetc(fin); for(i = 0; i < n; i++) { for(j = 0; j < n; j++) //arr[i][j] = fgetc(fin); is fine!! fscanf(fin, "%c", &arr[i][j]);//%c will get '/n' fgetc(fin); } for(i = 0; i < n; i++) { for(j = 0; j < n; j++) fscanf(fin, "%c", &arrplus[i][j]); fgetc(fin); } for(k = 1; k < 9; k++){ flag = 1; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { switch(k) { case 1: if(arr[i][j] != arrplus[j][n - i -1]) { flag = 0; }break; case 2: if(arr[i][j] != arrplus[n - i -1][n - j - 1]) { flag = 0; }break; case 3: if(arr[i][j] != arrplus[n - j -1][i]) { flag = 0; }break; case 4: if(arr[i][j] != arrplus[i][n - j - 1]) { flag = 0; }break; case 5: if(arr[i][j] != arrplus[n - j -1][n - i - 1]) { flag = 0; }break; case 6: if(arr[i][j] != arrplus[n - i -1][j]) { flag = 0; }break; case 7: if(arr[i][j] != arrplus[j][i]) { flag = 0; }break; case 8: if(arr[i][j] != arrplus[i][j]) { flag = 0; }break; } } } if(flag) break; } switch(k) { case 1: case 2: case 3: case 4:fprintf(fout, "%d/n", k); break; case 5: case 6: case 7:fprintf(fout, "5/n"); break; case 8:fprintf(fout, "6/n"); break; case 9:fprintf(fout, "7/n"); break; } exit(0); }
本题因为情形比较少,所以用枚举的方法把所有的映射关系都列了出来。。。
看了分析,觉得我的方法确实很蠢,旋转180度完全可以用两次旋转90度表示出来,没有必要列出一堆映射关系!
还有一点,分析中定义了结构体,然后居然可以直接进行结构体变量间的赋值操作,我印象中是不允许的,难道我记错了?回头查查再更新一下
唉,做到现在虽然都AC了,但没有一道解法是自己感到满意的
继续做,SHIT!