P1205 [USACO1.2] 方块转换 Transformations

题目描述

一块 n × n n \times n n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

  • 90 ° 90\degree 90°:图案按顺时针转 90 ° 90\degree 90°

  • 180 ° 180\degree 180°:图案按顺时针转 180 ° 180\degree 180°

  • 270 ° 270\degree 270°:图案按顺时针转 270 ° 270\degree 270°

  • 反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。

  • 组合:图案在水平方向翻转,然后再按照 1 ∼ 3 1 \sim 3 13 之间的一种再次转换。

  • 不改变:原图案不改变。

  • 无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

只使用上述 7 7 7 个中的一个步骤来完成这次转换。

输入格式

第一行一个正整数 n n n

然后 n n n 行,每行 n n n 个字符,全部为 @-,表示初始的正方形。

接下来 n n n 行,每行 n n n 个字符,全部为 @-,表示最终的正方形。

输出格式

单独的一行包括 1 ∼ 7 1 \sim 7 17 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

样例 #1

样例输入 #1

3
@-@
---
@@-
@-@
@--
--@

样例输出 #1

1

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 10 1\le n \le 10 1n10

1.题目分析

主要是考查二维数组的使用,除此之外就是空间想象能力。
大概题意就是:输入一个n表示矩阵的阶数,输入两个字符N阶的字符矩阵,
第一个矩阵表示初始图案,第二个表示最终图案。
题目一共给出了七种方案和结果,根据初始矩阵最后的变换结果输出是方案几。

值得一提的是,我这里使用的是C++的输入,刚开始用的C写的,需要使用getchar()函数消除scanf()函数的换行符,但是由于做题网站的编译系统是部署在Linux上的,依旧报错,之所以这里使用了C++的输入方式,是因为他和Java一样是跨平台的。

2.题目思路

定义两个函数:
比较函数:输入两个数组,比较是否相同,用于判别最终结果。
打印函数:用于查看临时数组里的图案变换情况。
将初始图案和目标图案分别存入字符二维数组arr1和arr2,定义一个临时二维数组,用于和目标数组比较。接下来,将初始图案变换之后赋值给临时数组,顺序判断:

  • 转90
  • 转180
  • 转270
  • 反射
  • 组合
  • 不改变:原图案不改变
  • 无效转换

(这些变化就是一些行和列的交换,也没什么好讲的)

对应这七种变化,如果满足(临时数组和目标数组通过比较函数判别相同时)则打印相应方案的序号。当然,为了方便做题,使用打印函数观察变化结果也是必不可少的。

3.代码演示

#include <stdio.h>
#include <bits/stdc++.h>using namespace std;//比较两个数组是否一致
int compareTo(char arr1[10][10], char arr2[10][10], int n) {int flag = 1;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (arr1[i][j] != arr2[i][j]) {flag = 0;}}}return flag;
}//用于查看图案变换情况
void print(char arr[10][10], int n) {for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {printf("%c", arr[i][j]);}printf("\n");}
}int main() {int n;scanf("%d", &n);char arr1[10][10];char arr2[10][10];char temp[10][10];char c;//初始图案插入for (int i = 0; i < n; ++i) {
//        getchar();for (int j = 0; j < n; ++j) {
//            scanf("%c", &c);cin >> c;arr1[i][j] = c;}}//最后结果的图案for (int i = 0; i < n; ++i) {//消除换行符
//        getchar();for (int j = 0; j < n; ++j) {
//            scanf("%c", &c);cin >> c;arr2[i][j] = c;}}//转90for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {temp[j][n - 1 - i] = arr1[i][j];}}if (compareTo(temp, arr2, n) == 1) {printf("1\n");return 0;}//转180for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {temp[n - 1 - i][n - 1 - j] = arr1[i][j];}}if (compareTo(temp, arr2, n) == 1) {printf("2\n");return 0;}//转270for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {temp[n - 1 - j][i] = arr1[i][j];}}if (compareTo(temp, arr2, n) == 1) {printf("3\n");return 0;}//反射for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {temp[i][n - 1 - j] = arr1[i][j];}}if (compareTo(temp, arr2, n) == 1) {printf("4\n");return 0;}//组合char ch[10][10];//用于存储组合之后的图案//1∼3 之间的一种再次转换。//组合转90for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {ch[j][n - 1 - i] = temp[i][j];}}if (compareTo(ch, arr2, n) == 1) {printf("5\n");return 0;}//组合转180for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {ch[n - 1 - i][n - 1 - j] = temp[i][j];}}if (compareTo(ch, arr2, n) == 1) {printf("5\n");return 0;}//组合转270for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {ch[n - 1 - j][i] = temp[i][j];}}if (compareTo(ch, arr2, n) == 1) {printf("5\n");return 0;}//不改变:原图案不改变if (compareTo(arr1, arr2, n) == 1) {printf("6\n");return 0;}//无效转换if (compareTo(temp, arr2, n) == 0 || compareTo(ch, arr2, n) == 0) {printf("7\n");}return 0;
}

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

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

相关文章

全志F1C200S嵌入式驱动开发(从DDR中截取内存)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 linux内核起来的时候,不一定所有的内存都是分配给linux使用的。有的时候,我们是希望能够截留一部分内存的。为什么保留这部分内存呢?这里面可以有很多的用途。比如说,第一,如果…

非阻塞IO

非阻塞IO fcntl 一个文件描述符, 默认都是阻塞IO。fcntl可以将某个文件描述符设置为非阻塞IO&#xff0c;先看一下文档介绍。 传入的cmd的值不同&#xff0c;后面追加的参数也不相同。 fcntl函数有5种功能: 复制一个现有的描述符&#xff08;cmd F_DUPFD&#xff09;。获得…

【SpringBoot】86、SpringBoot中集成Quartz根据Cron表达式获取接下来5次执行时间

本篇文章根据集成 Quartz 根据 Cron 表达式获取接下来的 5 次执行时间,在配置定时任务时,可以清晰地知道自己的 Cron 表达式是否正确,对于 Quartz 不熟悉的同学可以先看看我之前的文章 【SpringBoot】82、SpringBoot集成Quartz实现动态管理定时任务 【SpringBoot】83、Spri…

安全基础 --- 编码(02)+ form表单实现交互

浏览器解析机制和XSS向量编码 <!-- javascript伪协议不能被urlcode编码&#xff0c;但可以被html实体编码:也是js协议的一部分&#xff0c;不能被编码js协议被解码后&#xff0c;URL解析器继续解析链接剩下的部分unicode编码可识别实现解码但符号不能被编码&#xff0c;编码…

Go和Java实现桥接模式

Go和Java实现桥接模式 我们下面通过跨平台(Windows、Mac 和 Linux)播放不同格式的视频文件(mpeg、rmvb、avi 和 wmv)来说明桥接 模式的使用。 1、桥接模式 桥接是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;…

Communications link failure

异常信息&#xff1a; org.springframework.orm.jpa.JpaSystemException: Unable to commit against JDBC Connection; nested exception is org.hibernate.TransactionException: Unable to commit against JDBC Connectionat org.springframework.orm.jpa.vendor.Hibernate…

android 测试设备以太网口的黄绿灯

需求&#xff1a;测试android 设备以太网口的黄灯和绿灯是否正常 ThreadUtils.runOnSubThread(new Runnable() { Override public void run() { Log.d("coco","test network 1000m start."); LinuxCommandRunner.exec("su"); LinuxCommandRunner…

【JavaScript 】深入理解浏览器本地存储

简介 Web本地存储是一种在浏览器中存储数据的机制,允许开发者在客户端存储和检索数据。本教程将详细介绍Web本地存储的不同技术和方法,包括LocalStorage和SessionStorage。 LocalStorage 存储数据 LocalStorage是一种在浏览器中存储数据的API,可以将键值对保存到客户端浏览…

11.物联网操作系统内存管理

一。STM32编译过程及程序组成 STM32编译过程 程序的组成、存储与运行 MDK生成的主要文件分析 1.STM32编译过程 1.源文件&#xff08;Source code&#xff09;--》目标文件&#xff08;Object code&#xff09; .c(C语言)通过armcc生成.o&#xff0c;.s&#xff08;汇编&…

gdb学习笔记

参考:https://blog.csdn.net/Stars_WW/article/details/88994391 gdb常用交互命令 启动gdb后&#xff0c;进入到交互模式&#xff0c;通过以下命令完成对程序的调试&#xff1b;注意高频使用的命令一般都会有缩写&#xff0c;熟练使用这些缩写命令能提高调试的效率&#xff1b;…

ELD透明屏在智能家居中有哪些优点展示?

ELD透明屏是一种新型的显示技术&#xff0c;它能够在不需要背光的情况下显示图像和文字。 ELD透明屏的原理是利用电致发光效应&#xff0c;通过在透明基板上涂覆一层特殊的发光材料&#xff0c;当电流通过时&#xff0c;发光材料会发出光线&#xff0c;从而实现显示效果。 ELD…

Android 从LibVLC-android到自编译ijkplayer播放H265 RTSP

概述 ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support. 官方的描述就这么简单的一句话&#xff0c;但丝毫都不影响它的强大。 从LibVLC 到 ijkplayer 截止到2023.7.20 LibVLC-Android 最大的问题在与OOM&#xff0c;测试了…

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

【JAVA】类和对象

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

HTML|计算机网络相关

1.三次握手 第一次握手&#xff1a;客户端首先向服务端发送请求。 第二次握手&#xff1a;服务端在接收到客户端发送的请求之后&#xff0c;需要告诉客户端已收到请求。 第三次握手&#xff1a;客户端在接收到服务端发送的请求和确认信息之后&#xff0c;同样需要告诉服务端已…

Maven设置阿里云路径(防止加载过慢)

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …

OpenCV图像处理技巧之空间滤波

1. 引言 再次问好&#xff0c;图像处理爱好者们&#xff01;&#x1f31f; 在前面的章节中&#xff0c;我们学习了图像处理的基础知识&#xff0c;并展现了图像增强的魅力。在这一节中&#xff0c;我们将更深入地研究空间滤波技术。 闲话少说&#xff0c;我们直接开始吧&#…

设计模式--策略模式(由简单工厂到策略模式到两者结合图文详解+总结提升)

目录 概述概念组成应用场景注意事项类图 衍化过程需求简单工厂实现图代码 策略模式图代码 策略模式简单工厂图代码 总结升华版本迭代的优化点及意义什么样的思路进行衍化的扩展思考--如何理解策略与算法 概述 概念 策略模式是一种行为型设计模式&#xff0c;它定义了算法家族&…

【LeetCode】094. 分割回文串II

文章目录 1. 解题思路1.1 创建dp表1.2 状态转移方程1.3 提前求出所有子串是否是回文串 2. 整体代码 1. 解题思路 1.1 创建dp表 这道题我们使用动态规划的方法来解&#xff0c;首先创建一个大小为字符串长度的dp表。dp[i] 表示 s[0, i] 的字符串最小划分多少次可以全划分为回文…