USACO-section1.2.2 transform

题意:
题意:给定两个n*n(1<=n<=10)的矩阵,通过1-7的操作是否能使两个矩阵相同,输出序号小的操作。
1、顺时针旋转90度
2、顺时针旋转180度
3、顺时针旋转270度
4、轴对称
5、轴对称后进行一次1-3的操作
6、不做操作
7、无法通过上面的操作得到
题解:
相当于只有顺时针旋转和轴对称两种操作。
注意: 输出最小序号

/*
ID:jsntrdy1
PROG: transform
LANG: C++
*/

#include<cstdio>
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("transform.in");
ofstream fout("transform.out");
const int N=11;
int n;
char mat[N][N];
char matc[N][N];
char temp[N][N];
void rotate()
{
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      temp[i][j]=mat[n+1-j][i];
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      mat[i][j]=temp[i][j];     
}
void reflect()
{
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      temp[i][j]=mat[i][n+1-j];
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      mat[i][j]=temp[i][j];     
}
bool isOK()
{
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        if(mat[i][j]!=matc[i][j])
          return false;
    return true;
}
int main()
{

    fin>>n;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        fin>>mat[i][j];
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        fin>>matc[i][j];
    bool flag=false;
    if(isOK())
    {
       flag=true;
    }
    //判断1~3 
    for(int i=0;i<3;i++)
    {
        rotate();
        if(isOK())
        {
           fout<<i+1<<endl;
           return 0;
        }
    }
    //旋转360 回到原位
    rotate(); 
    reflect();
    if(isOK())
    {
       fout<<'4'<<endl;
       return 0;
    }
    for(int i=0;i<3;i++)
    {
        rotate();
        if(isOK())
        {
           fout<<'5'<<endl;
           return 0;
        }
    }
    if(flag)
      fout<<'6'<<endl;
    else
      fout<<'7'<<endl;


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值