题目描述
一块n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
-
转 90°:图案按顺时针转 90°。
-
转 180°:图案按顺时针转 180°。
-
转 270°:图案按顺时针转 270°。
-
反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
-
组合:图案在水平方向翻转,然后再按照 1∼3 之间的一种再次转换。
-
不改变:原图案不改变。
-
无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用上述 7 个中的一个步骤来完成这次转换。
输入格式
第一行一个正整数 n。
然后 n 行,每行 n 个字符,全部为 @
或 -
,表示初始的正方形。
接下来 n 行,每行n 个字符,全部为 @
或 -
,表示最终的正方形。
输出格式
单独的一行包括 1∼7 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
输入输出样例
输入 #1复制
3 @-@ --- @@- @-@ @-- --@
输出 #1复制
1
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤10。
题目翻译来自 NOCOW。
USACO Training Section 1.2
思路
按题意,1~7种操作分别为:
1:
c[i][j]=a[n-1-i][n-1-j];
2:
c[i][j]=a[n-1-j][i];
3:
c[i][j]=a[j][n-1-i];
4:
c[i][j]=a[i][n-1-j];
5:
(1)
d[i][j]=a[i][n-1-j];
(2)
d[i][j]=a[i][n-1-j];
(3)
d[i][j]=a[i][n-1-j];
6:
c[i][j]=a[i][j];
如果以上操作都不行,输出7。
同时,还需要一个判断函数。
——————————————————————————————————————————
C++代码实现
#include <bits/stdc++.h>//万能头文件
using namespace std;//使用标准命名空间
int n;
char a[10][10],b[10][10],c[10][10],d[10][10];
//一大堆函数
bool ifr()//判断是否构成新方块
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(c[i][j]!=b[i][j])//单一元素不同,直接返伪
return false;
return true;//否则是真
}
void ts_90()//顺时针90°(1)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[n-1-j][i];
}
void ts_180()//顺时针180° (2)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[n-1-i][n-1-j];
}
void tn_90()//逆时针90° (3)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[j][n-1-i];
}
void ref()//反射 (4)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[i][n-1-j];
}
void mode_1()//组合1 (5)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=a[i][n-1-j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=d[n-1-j][i];
}
void mode_2()//组合2 (5)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=a[i][n-1-j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=d[n-1-i][n-1-j];
}
void mode_3()//组合3 (5)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=a[i][n-1-j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=d[j][n-1-i];
}
void norm()//不改变 (6)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[i][j];
}
//否则是7
int main()
{
//输入
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>b[i][j];
//按题意进行操作,输出1~6
ts_90();
if(ifr())
{
cout<<"1";
return 0;
}
ts_180();
if(ifr())
{
cout<<"2";
return 0;
}
tn_90();
if(ifr())
{
cout<<"3";
return 0;
}
ref();
if(ifr())
{
cout<<"4";
return 0;
}
mode_1();
if(ifr())
{
cout<<"5";
return 0;
}
mode_2();
if(ifr())
{
cout<<"5";
return 0;
}
mode_3();
if(ifr())
{
cout<<"5";
return 0;
}
norm();
if(pd())
{
cout<<"6";
return 0;
}
cout<<"7";
return 0;
}
制作不易,点个赞再走吧!