CSP201503-1:图像旋转
2018-06-17 21:18:39来源:未知 阅读 ()
引言: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; } |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 二值图像连通域标记算法优化 2020-03-11
- 关于非旋转Treap 2020-01-09
- 图像去模糊算法 循序渐进 附完整代码 2018-10-03
- Opencv利用ROI将一张图片叠加到另一幅图像的指定位置 2018-08-10
- 利用OpenCV给图像添加中文标注 2018-08-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash