引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國電腦學會(CCF)發起的"電腦職業資格認證"考試,針對電腦軟體開發、軟體測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人 ...
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國電腦學會(CCF)發起的"電腦職業資格認證"考試,針對電腦軟體開發、軟體測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人員,以及高校招考研究生的覆試對象。
- 問題描述
旋轉是圖像處理的基本操作,在這個問題中,你需要將一個圖像逆時針旋轉90度。
電腦中的圖像表示可以用一個矩陣來表示,為了旋轉一個圖像,只需要將對應的矩陣旋轉即可。
- 輸入格式
輸入的第一行包含兩個整數n, m,分別表示圖像矩陣的行數和列數。
接下來n行每行包含m個整數,表示輸入的圖像。
- 輸出格式
輸出m行,每行包含n個整數,表示原始矩陣逆時針旋轉90度後的矩陣。
-
樣例輸入
2 3
1 5 3
3 2 4
-
樣例輸出
3 4
5 2
1 3
-
評測用例規模與約定
1 ≤ n, m ≤ 1,000,矩陣中的數都是不超過1000的非負整數。
- 源代碼(一):使用動態分配的一維數組
/* 一維數組的方式求解,空間動態分配 */ # include <stdio.h> # include <stdlib.h> # include <memory.h>
int main(void) { int n; //行數 int m; //列數 scanf("%d", &n); scanf("%d", &m); int count = m*n+1; int *input = (int *)malloc(sizeof(int) * count); memset(input, 0, sizeof(int) * count); int *output = (int *)malloc(sizeof(int) * count); memset(output, 0, sizeof(int) * count);
for (int i = 1; i < count; i++) { scanf("%d", input+i); int row_in = (i / m) + 1; int column_in = i % m; if (column_in == 0) { row_in -= 1; column_in = m; } int row_out = m + 1 - column_in; int column_out = row_in; output[(row_out - 1) * n + column_out] = input[i]; }
int num = 0; for (int i = 1; i < count; i++) { num += 1; if (num == n) { printf("%d\n", output[i]); num = 0; } else { printf("%d ", output[i]); } }
free(input); free(output);
return 0; } |
- 源代碼(二):使用動態分配的二維數組
/* 二維數組的方式求解,空間動態分配 */ # include <stdio.h> # include <stdlib.h> # include <memory.h>
int main(void) { int n; //行數 int m; //列數 scanf("%d", &n); scanf("%d", &m); //給輸入的二維數據分配空間 int **input = (int **)malloc(sizeof(int *) * n); //給行分配空間 for (int i = 0; i < n; i++) //給列分配空間 { input[i] = (int *)malloc(sizeof(int) * m); memset(input[i], 0, sizeof(int) * m); } //給輸出的二維數組分配空間 int **output = (int **)malloc(sizeof(int *) * m); //給行分配空間 for (int i = 0; i < m; i++) //給列分配空間 { output[i] = (int *)malloc(sizeof(int) * n); memset(output[i], 0, sizeof(int) * n); }
for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &input[i][j]); output[m-1-j][i] = input[i][j]; } }
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (j == n-1) { printf("%d\n", output[i][j]); } else { printf("%d ", output[i][j]); } } }
//回收分配給輸入數組的記憶體 for (int i = 0; i < n; i++) { free(input[i]); } free(input); //回收分配給輸出數組的記憶體 for (int i = 0; i < m; i++) { free(output[i]); } free(output);
return 0; } |