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;我们都可以通过重装系统来一劳永…

python常用类型的内置函数列表

1、list.append(obj) 向列表中加入一个对象obj fruits [apple, pear, orange] >>> fruits.append(apple) >>> fruits [apple, pear, orange, apple]2、list.count(obj) 返回一个对象obj在列表中出现的次数 >>> fruits.count(a…

java虚拟内存扩展_Java 8虚拟扩展方法

java虚拟内存扩展我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了&#xff0c;我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的&#xff1a; http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在&…

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…

史上最全的技术手册整理总结,编程小白都从这篇文章迅速成为大牛

孙叫兽,前端全栈攻城狮,更多资源请关注微信公众号:电商程序员 整理云端的开发,助你开发效率与认知起码提升十倍。 技术手册 Python初级手册Python进阶手册Python2手册Python3手册HTML手册CSS手册CSS3手册HTML5手册Boostrap4手册Boostrap3手册Boostrap手册

并发最佳实践

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

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…

夺命雷公狗---无限级分类NO3

<?phpheader("Content-Type:text/html;charsetutf-8");/*无限级分类。牵扯2个应用0是-找指定栏目的子栏目1是-找指定栏目的子孙栏目&#xff0c;即子孙树2是-找指定栏目的父栏目/父父栏目....顶级栏目&#xff0c;即家谱树*/$aarr array(array(id>1,name>…

百度地图接口调用

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

java后端工程师平时开发或多或少会用到eclipse,那么它有哪些快捷键呢

孙叫兽&#xff0c;前端全栈工程师&#xff0c;微信公众号&#xff1a;电商程序员&#xff0c;主页QQ群有eclipse安装包。 下载地址&#xff1a;https://www.eclipse.org/downloads/ Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言&#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…

亚马逊标题自动抓取_15分钟内开始使用Amazon Web Services和全自动资源调配

亚马逊标题自动抓取在等待一个新项目时&#xff0c;我想学习一些有用的东西。 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能&#xff0c;而很少有足够的硬件来生成实际负载&#xff0c;因此我决定学习更多有关按需在云中按需配置虚拟机的知识&#xff0c;即…

java后端工程师平时开发或多或少会用到Intellij idea,那么它有哪些快捷键呢

孙叫兽,前端全栈工程师,微信公众号:电商程序员,主页QQ群有Intellij idea安装包及注册码。 下载地址:https://www.jetbrains.com/idea/download/ IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、…

网络安全设备默认密码

因为触及敏感词v-p-n,需要将 ‘-’去掉。 设备默认账号默认密码深信服产品sangforsangfor sangfor2018 sangfor2019深信服科技 ADdlanrecover深信服负载均衡 AD 3.6adminadmin深信服WAC ( WNS V2.6)adminadmin深信服v-p-nAdminAdmin深信服ipsec-V-P-N (SSL 5.5)AdminAdmin深信…

Java注释处理器

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

浅谈“PHP multipart/form-data 远程DOS漏洞”

一&#xff1a;漏洞名称&#xff1a; PHP multipart/form-data 远程DOS漏洞 描述&#xff1a; PHP 在处理HTTP请求中的multipart/form-data头部数据时存在一个安全漏洞&#xff0c;导致PHP大量重复分配和拷贝内存的操作&#xff0c;可能造成CPU资源占用100%并持续较长时间&…