usaco基础第五题Transformations
看到这个题还以为是个搜索题,搜索向来不会,以为得卡在这儿,后面仔细看了下题,几个变换发型没什么难的,就是这句In the case that more than one transform could have been used, choose the one with the minimum number above. 以为要用很多次变换才能变换到目的数组,看了下题目的翻译,才知道这句话的意思是如果有多种可用的转换方法,请选择序号最小的那个。如果是这样的话那就简单了。只要按照序号枚举就行了。记得第六个应该放在第六个位置。还有只要遇到一样的状态,就打印序号,然后退出。如果忘记退出会打印多个数字wa。
/*
ID: like_091
PROG: transform
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 12;
char before[N][N], now[N][N];
int n;
//翻转九十度
void rotat(char x[N][N])
{
char temp[N][N];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
temp[j][n - i + 1] = x[i][j];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
x[i][j] = temp[i][j];
}
//水平翻转
void reflect(char x[N][N])
{
char temp[N][N];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
temp[i][n - j + 1] = x[i][j];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
x[i][j] = temp[i][j];
}
//判断是否是一样
bool equal(char p[N][N], char q[N][N])
{
bool flag = true;
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
if (p[i][j] != q[i][j])
flag = false;
return flag;
}
//把一个数组复制到另一个
void fun(char x[N][N], char y[N][N])
{
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
y[i][j] = x[i][j];
}
int main(void)
{
ifstream cin("transform.in");
ofstream cout("transform.out");
while (cin>>n)
{
char a[N][N];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
cin>>before[i][j];
for (short i = 1; i <= n; i++)
for (short j = 1; j <= n; j++)
cin>>now[i][j];
fun(before, a);//把原来的数组复制到a中
for (int k = 1; k <= 3; k++)
{
rotat(a);//翻转90度
if (equal(a, now))
{
cout<<k<<endl;
break;
}
}
//已经相等就退出
if (equal(a, now))continue;
fun(before, a);//重新复制到a中
reflect(a);//水平翻转
if (equal(a, now))
{
cout<<"4"<<endl;
continue;
}
for (int k = 1; k <= 3; k++)
{
rotat(a);//翻转90度
if (equal(a, now))
{
cout<<"5"<<endl;
break;
}
}
//如果已经相等就退出
if (equal(a, now))continue;
//记得6应该放到此处,放到前面wa
if (equal(before, now))
{
//如果相等无需变换
cout<<"6"<<endl;
continue;
}
cout<<"7"<<endl;
}
return 0;
}
浙公网安备 33010602011771号