洛谷 P1205 [USACO1.2]方块转换 Transformations

2024-01-29 20:18

本文主要是介绍洛谷 P1205 [USACO1.2]方块转换 Transformations,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

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

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

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

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

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

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

输入输出格式

输入格式:
第一行: 单独的一个整数N。

第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。

第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

输出格式:
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

输入输出样例

输入样例#1:
在这里插入图片描述

输出样例#1:
1

说明
题目翻译来自NOCOW。
USACO Training Section 1.2
.
.
.
.
.
.
分析
一道模拟题
这里调换了2和3,是因为不存在顺时针转90度不可行,而顺时针转180度和逆时针转90度同时可行的情况。
.
.
.
.
.
.
程序:

#include<iostream>
using namespace std;
int n,flag,f,g,h,x,y,p,z;
char a[100][100],b[100][100],c[100][100],d[100][100],e[100][100],w[100][100],r[100][100],t[100][100];
int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>d[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=a[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){flag=1;break;}if(flag==0){cout<<1;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)e[i][j]=a[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)w[i][j]=e[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(w[i][j]!=d[i][j]){f=1;break;}if(f==0&&flag==1){cout<<3;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)r[i][j]=a[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=r[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(t[i][j]!=d[i][j]){g=1;break;}if(g==0&&f==1&&flag==1){cout<<2;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(t[i][j]!=d[i][j]){x=1;break;}if(x==0&&g==1&&f==1&&flag==1){cout<<4;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){y=1;break;}if(y==0&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){z=1;break;}if(z==0&&y==1&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){p=1;break;}if(p==0&&z==1&&y==1&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][j]!=d[i][j]){h=1;break;}if(h==0&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1){cout<<6;return 0;}if(h==1&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)cout<<7;return 0;
}

这篇关于洛谷 P1205 [USACO1.2]方块转换 Transformations的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658067

相关文章

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C++实现俄罗斯方块(Windows控制台版)

C++实现俄罗斯方块(Windows控制台版) 在油管上看到一个使用C++控制台编写的俄罗斯方块小游戏,源代码200多行,B站上也有相关的讲解视频,非常不错,值得学习。 B站讲解视频地址为:【百万好评】国外技术大神C++游戏编程实战教程,油管580W收藏,新手10小时入门,并快速达到游戏开发能力(中英字幕) B站 CSDN博主千帐灯无此声还为此写了一篇博客:C++实现俄罗斯方块(源码+详解),讲

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

VC环境下整型转换为字符串型(2)

在串口下位机的发送中,可能会用到需要发送数字,显示为字符串型的 和上一篇文字《串口中字符串转换为整型》一正一反,知识点学习会了: #include<iostream.h> #include <stdio.h> #include <string.h>   void inttostr(int m,unsigned char * str) { int length=0;   int tmp,te

时间日期与时间戳转换(Linux C)

本文主要学习三个知识点,第一是UTC时间、GMT时间的概念;第二是在Unix环境下UTC时间与时间戳的转换;第三是在C语言中如何修改时区。 本文参考了《UNP》以及 http://blog.csdn.net/foxir/article/details/43916601 http://blog.csdn.net/ljafl9988/article/details/16847935 一、

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一