NOI 练手题 图像旋转翻转变换

题目:来源http://noi.openjudge.cn/ch0112/09/

总时间限制: 
1000ms
内存限制: 
65536kB
描述

给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。

其中,可能的操作及对应字符有如下四种:

A:顺时针旋转90度;

B:逆时针旋转90度;

C:左右翻转;

D:上下翻转。

输入
第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值范围在0到255之间。
接下来一行,包含由A、B、C、D组成的字符串s,表示需要按顺序执行的操作序列。s的长度在1到100之间。
输出
m'行,每行包含n'个整数,为最终图像各像素点的灰度值。其中m'为最终图像的行数,n'为最终图像的列数。相邻两个整数之间用单个空格隔开。
样例输入
2 3
10 0 10
100 100 10
AC
解析:    题目要求转换最终的结果。分析题目发现,它的变换情况只有两种:旋转、翻转(轴对称)。    通过我们自己的想象可以知道:    无论图形按照ABCD的命令怎么变换,最终也只会有八种形态:      1.不翻转,顺时针旋转0°,即不变      2.不翻转,顺时针旋转90°      3.不翻转,顺时针旋转180°      4.不翻转,顺时针旋转2700°      5.按某一个方向翻转后,顺时针旋转0°
      6.按某一个方向翻转后,顺时针旋转90°
      7.按某一个方向翻转后,顺时针旋转180°
      8.按某一个方向翻转后,顺时针旋转270°
      (为了方便,我们同一将  “按某一个方向翻转”  改为  “按图形左边缘为对称轴进行轴对称”)      于是我们可以画出图形经过翻转后的八种形态(对于我这个懒人,拿一张纸直接变换,是懒得用脑子想象的一种好方法)。
1   2   3   4  
123 741 987 369
456 852 654 258
789 963 321 147
               
5   6   7   8  
321 963 789 147
654 852 456 258
987 741 123 369
  最朴素的算法,就是按照命令的形式,一次一次地翻转图形,但是这很耗时间,基本上就别想Accept了。  我们在此基础上做了点改进:    按照命令的形式,一次一次地翻转“图形的形态”      ——什么意思?我们可以把图形每种样子做一个编码,就像警察发通缉令,有时候嫌疑人的照片一张不够:戴牛仔帽的,穿夹克的,叼雪茄的……我们也是如此(如上图所示)  我们在一个函数中完成对命令的解析,传回图形最后的形态(给它一顿最后的晚餐~~)。  之后也有一种优化的方法:    原来我们想着就直接把图形真正做一个变换,但是如果图形太大,这也很耗时间;    所以我们不妨从输出下手,改变输出的顺序,来达到变换图形的效果。代码:(为人类造福)
  1 #include <stdio.h>
  2 #include <string.h>
  3 struct command{
  4     char str[101];
  5     int length;
  6 };
  7 int ExplainCommand(struct command s);
  8 void Print(int *pho,int way,int height,int width);
  9 int main()
 10 {
 11     int m,n,i,j;
 12     int pho[10000];
 13     struct command s;
 14     
 15     
 16     scanf("%d%d",&m,&n);
 17     for(i=0;i<m;i++)
 18     {
 19         for(j=0;j<n;j++)
 20         {
 21             scanf("%d",&pho[i*n+j]);
 22         }
 23     }
 24     getchar();
 25         gets(s.str);
 26         s.length=strlen(s.str);
 27         
 28         Print(pho,ExplainCommand(s),m,n);
 29     
 30     return 0;
 31 }
 32 int ExplainCommand(struct command s)//对命令行做解析,分析出最终的形态 
 33 {
 34     int ans=1;//假定目前最终形态为不变
 35     int i;
 36     for(i=0;i<s.length;i++)
 37     {
 38         if(s.str[i]=='A')
 39         {
 40             switch(ans)
 41             {
 42                 case 1:    ans=2    ;break;
 43                 case 2:    ans=3    ;break;
 44                 case 3:    ans=4    ;break;
 45                 case 4:    ans=1    ;break;
 46                 case 5:    ans=6    ;break;
 47                 case 6:    ans=7    ;break;
 48                 case 7:    ans=8    ;break;
 49                 case 8:    ans=5    ;break;
 50             }
 51         }
 52         
 53         else if(s.str[i]=='B')
 54         {
 55             switch(ans)
 56             {
 57                 case 1:    ans=4    ;break;
 58                 case 2:    ans=1    ;break;
 59                 case 3:    ans=2    ;break;
 60                 case 4:    ans=3    ;break;
 61                 case 5:    ans=8    ;break;
 62                 case 6:    ans=5    ;break;
 63                 case 7:    ans=6    ;break;
 64                 case 8:    ans=7    ;break;
 65             }
 66         }
 67         else if(s.str[i]=='C')
 68         {
 69             switch(ans)
 70             {
 71                 case 1:    ans=5    ;break;
 72                 case 2:    ans=8    ;break;
 73                 case 3:    ans=7    ;break;
 74                 case 4:    ans=6    ;break;
 75                 case 5:    ans=1    ;break;
 76                 case 6:    ans=4    ;break;
 77                 case 7:    ans=3    ;break;
 78                 case 8:    ans=2    ;break;
 79             }
 80         }
 81         else if(s.str[i]=='D')
 82         {
 83             switch(ans)
 84             {
 85                 case 1:    ans=7    ;break;
 86                 case 2:    ans=6    ;break;
 87                 case 3:    ans=5    ;break;
 88                 case 4:    ans=8    ;break;
 89                 case 5:    ans=3    ;break;
 90                 case 6:    ans=2    ;break;
 91                 case 7:    ans=1    ;break;
 92                 case 8:    ans=4    ;break;
 93             }
 94         }
 95     } 
 96     return ans;
 97 }
 98 void Print(int *pho,int way,int height,int width)
 99 {
100 /*图形经过各种旋转变换后,最后的形态只有8种 
101  *前四种: 
102  *1=未翻转,顺时针旋转 0
103  *2=未翻转,顺时针旋转 90
104  *3=未翻转,顺时针旋转 180
105  *4=未翻转,顺时针旋转 270
106  *后四种: 
107  *5=以图形左边为对称轴对称,顺时针旋转 0
108  *6=以图形左边为对称轴对称,顺时针旋转 90
109  *7=以图形左边为对称轴对称,顺时针旋转 180
110  *8=以图形左边为对称轴对称,顺时针旋转 270
111  */ 
112      int i,j,temp;
113      
114      
115     if(way==1)
116     {
117         for(i=0;i<height;i++)
118         {
119             for(j=0;j<width;j++)
120             {
121                 temp=*(pho+i*width+j);
122                 printf("%d ",temp);
123             }
124             printf("\n");
125         }
126     }
127     
128     
129     else if(way==2)
130     {
131         for(j=0;j<width;j++)
132         {
133             for(i=height-1;i>=0;i--)
134             {
135                 temp=*(pho+i*width+j);
136                 printf("%d ",temp);
137             }
138             printf("\n");
139         }
140     }
141     
142     
143     else if(way==3)
144     {
145         for(i=height-1;i>=0;i--)
146         {
147             for(j=width-1;j>=0;j--)
148             {
149                 temp=*(pho+i*width+j);
150                 printf("%d ",temp);
151             }
152             printf("\n");
153         }
154     }
155     
156     
157     else if(way==4)
158     {
159         for(j=width-1;j>=0;j--)
160         {
161             for(i=0;i<height;i++)
162             {
163                 temp=*(pho+i*width+j);
164                 printf("%d ",temp);
165             }
166             printf("\n");
167         }
168         
169     }
170     
171     
172     else if(way==5)
173     {
174         for(i=0;i<height;i++)
175         {
176             for(j=width-1;j>=0;j--)
177             {
178                 temp=*(pho+i*width+j);
179                 printf("%d ",temp);
180             }
181             printf("\n");
182         }
183     }
184     
185     
186     else if(way==6)
187     {
188         for(j=width-1;j>=0;j--)
189         {
190             for(i=height-1;i>=0;i--)
191             {
192                 temp=*(pho+i*width+j);
193                 printf("%d ",temp);
194             }
195             printf("\n");
196         }
197     }
198     
199     
200     else if(way==7)
201     {
202         for(i=height-1;i>=0;i--)
203         {
204             for(j=0;j<width;j++)
205             {
206                 temp=*(pho+i*width+j);
207                 printf("%d ",temp);
208             }
209             printf("\n");
210         }
211     }
212     
213     
214     else if(way==8)
215     {
216         for(j=0;j<width;j++)
217         {
218             for(i=0;i<height;i++)
219             {
220                 temp=*(pho+i*width+j);
221                 printf("%d ",temp);
222             }
223             printf("\n");
224         }
225     }
226     
227     return ;
228 }
不点开就不用花钱

 请不要问我为什么不用二维数组——因为在传参数的时候真心不好用……

 即使是用指针也如此(因为我不会呀~~)

 

转载于:https://www.cnblogs.com/CXSheng/p/4889241.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波

孙叫兽,安徽宿州人,北漂前端全栈程序员(朝着这个目标努力),如果你觉得这篇文章帮助了你,记得三连👉(转发+点赞+评论),技术交流请联系个人主页左侧导航栏。 这个插件的定位是提升程序员的开发效率的,至于哪方面?自己慢慢体会,我大致的感觉就是搜索引擎的导航网站的…

C盘全面清理教程!彻底清理所有垃圾!

预计阅读时间 10分钟 资源在文末获取哦 老懒粉应该知道&#xff0c;我们写过“宇宙最细”的系统安装/重装教程 但我们除了新机&#xff0c;通常情况下重装系统的目的是什么&#xff1f; 虽然不管电脑出现了什么样的软件方面问题&#xff0c;我们都可以通过重装系统来一劳永…

url重定向绕过方式

url重定向绕过方式 俗话说的好&#xff0c;上有政策&#xff0c;下有对策&#xff0c;url重定向的绕过姿势也越来越多样化。普通url重定向方法测试不成功&#xff0c;换个姿势&#xff0c;说不定可以再次绕过。 这里总结下成功的绕过方式。 &#xff08;1&#xff09; 使用…

【转】android:DDMS查看Threads--不错

原文网址&#xff1a;http://www.cnblogs.com/mybkn/archive/2012/05/27/2520335.html 有时候程序运行出现死锁或者信号量卡死是很纠结的问题&#xff0c;单看代码很难分析定位问题&#xff0c;这时候可以借助DDMS来查看threads的运行情况&#xff0c;一目了然。 手机连接上USB…

Fastjson反序列化漏洞复现(实战案例)

漏洞介绍 FastJson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链。 通俗理解就是&#xff1a;漏洞利用fastjson autotype在处理json对…

SVN Error: Can‘t connect to host xxxxx‘: 由于目标计算机积极拒绝,无法连接,的最快解决办法

孙叫兽&#xff0c;前端全栈&#xff0c;微信公众号&#xff1a;电商程序员。如果本文对你有帮助&#xff0c;记得点赞关注&#xff0c;谢谢&#xff01; 每次换个新电脑&#xff0c;新项目&#xff0c;新场地&#xff0c;新公司都有可能使用SVN下载老项目,有的是用内网&#x…

百度地图接口调用

当我们网站需要调用百度地图接口的时候&#xff0c;可以使用如下方法&#xff1a; 1.如何获取经纬度坐标 1.打开百度地图&#xff0c;在百度地图最底部找到“地图开放平台”链接。 2.进入“百度地图开放平台”网站中&#xff0c;在导航中选择“”开发文档>坐标拾取器“”…

信息安全系统设计基础第六周学习总结

第六章 存储器层次结构 存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。 1.CPU寄存器&#xff1a;容量小&#xff0c;成本高&#xff0c;访问快 2.高速缓存存储器&#xff1a;CPU和主存之间的缓存区域 3.主存&#xff1a;磁盘上大容量&#xff0c;成本低…

phpStudy + PhpStorm + XDebug调试【绝对能用】

具体参照的是这篇文章&#xff1a;https://blog.csdn.net/weixin_40418199/article/details/79088365 文章有些地方说的不是很详细想重写整理下。 【PHPStudy演示的版本为&#xff1a;PHP5.4.45-Apache】 1.PHPStudy配置 PHPStudy自带了XDebug的扩展&#xff0c;不需要下载 php…

加密编码类型的密文特征分析

转载https://blog.csdn.net/weixin_45728976/article/details/109219997 MD5、sha1、HMAC算法、NTLM等相似加密类型 1、MD5——示例21232F297A57A5A743894A0E4A801FC3 一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串&#xff0c;如图。如果出现这个范围以外的字符…

孙叫兽进阶之路之如何进行情绪管理

程序员不光有硬实力&#xff0c;更要有软实力。 程序员文武双全之道。 ---孙叫兽&#xff0c;前端全栈程序员&#xff0c;微信公众号&#xff1a;电商程序员。 情绪的作用&#xff0c;存在于我们每天的工作和生活中&#xff0c;无时不刻地影响着人们的思想和行为。如何控制和管…

javaone_JavaOne正在重建动力

javaone在JavaOne上度过了一个非常忙碌的一周&#xff0c;今年的活动有很多让人喜欢的地方。 有很多惊喜的公告&#xff0c;很多很好的内容/会议&#xff0c;并且在场地和组织上都有很多改进。 对于一直耐心等待我发表所有演讲的人们&#xff0c;我为您的延迟表示歉意……给4个…

夜神模拟器安装证书之burp抓包

安装步骤 1.http 不需要安装证书即可抓app包 2.https 需要安装证书 一、设置burp代理 注意IP是本机下的ip 二、模拟器设置代理 点击wifi长按鼠标修改网络 三、导出CA证书 模拟器中进入http://burp页面&#xff0c;点击黄色的地方下载 下载证书&#xff0c;可以选择本…

接手一个项目,后缀名为.bak文件,原来它是这个意思

.bak是备份文件&#xff0c;为文件格式扩展bai名&#xff0c;这类文件一du般在.bak前面加上应该有zhi原来的扩展名比如windows.dll.bak&#xff0c;或是windows_dll.bak&#xff0c;有dao的则是由原文件的后缀名和bak混合而成&#xff0c;如proteus的备份文件为.DBK。很多软件,…

java大佬是如何快速配置IntelliJ IDEA的Tomcat及安装配置Tomcat及java开发环境

孙叫兽,前端全栈工程师,java工程师。编译器及工具可以在主页QQ群群文件获取。 JDK 可以到官网下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Tomcat下载:Http://tomcat.apache.org/ IntelliJ IDEA下载:https://www.jetbrain…

应急响应 WEB 分析日志攻击,后门木马(手动分析 和 自动化分析.)

转载文章&#xff1a;https://blog.csdn.net/weixin_54977781/article/details/124976164?spm1001.2100.3001.7377&utm_mediumdistribute.pc_feed_blog_category.none-task-blog-classify_tag-17-124976164-null-null.nonecase&depth_1-utm_sourcedistribute.pc_feed_…

thinkphp第一节结构

thinkphp 网站:http://thinkphp.cn 输入网址&#xff1a;localhost:8080/demo/ 则说明thinkphp安装成功 目录结构如下&#xff1a; application子目录结构&#xff1a; common&#xff1a;公用文件目录 home&#xff1a;Home模板 Runtime&#xff1a;记录运行信息 home目录下&a…

孙叫兽进阶之路之软件开发生命周期

孙叫兽,前端全栈开发工程师,java工程师。 软件开发生命周期:

常用的30+种未授权访问漏洞汇总

未授权访问漏洞汇总预览 1 、FTP 未授权访问&#xff08;21&#xff09; 2 、LDAP 未授权访问&#xff08;389&#xff09; 3 、Rsync 未授权访问&#xff08;873&#xff09; 4 、ZooKeeper 未授权访问&#xff08;2181&#xff09; 5 、Docker 未授权访问&#xff08;2375&a…

孙叫兽进阶之路之敏捷开发

孙叫兽,前端全栈工程师,java工程师,技术交流请添加主页QQ群,微信公众号:电商程序员