2017-5-26
题目描述
给你两个n*n的字符矩阵,给你几种变换方式,输出从第一种状态到第二种状态
的最小操作序号
解答
我的方法就是直接从1到7挨个判断,满足题意就输出,直接结束,否则继续
代码比较长
代码
/*
ID: 18795871
PROG: transform
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("transform.in");
ofstream fout("transform.out");
const int N = 10;
char x[N+1][N+1],y[N+1][N+1],z[N+1][N+1],w[N+1][N+1];
int n;
void Trans1(char p[N+1][N+1],char q[N+1][N+1]){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
p[j][n-i-1]=q[i][j];
}
}
}
void Trans2(char p[N+1][N+1],char q[N+1][N+1]){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
p[n-i-1][n-j-1]=q[i][j];
}
}
}
void Trans3(char p[N+1][N+1],char q[N+1][N+1]){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
p[n-j-1][i]=q[i][j];
}
}
}
void Trans4(char p[N+1][N+1],char q[N+1][N+1]){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
p[i][n-j-1]=q[i][j];
}
}
}
void Trans5(char p[N+1][N+1],char q[N+1][N+1],int num){
switch(num){
case 1:
Trans1(p,q);
break;
case 2:
Trans2(p,q);
break;
case 3:
Trans3(p,q);
}
}
bool isOK(char p[N+1][N+1],char q[N+1][N+1]){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (p[i][j]!=q[i][j]) return false;
}
}
return true;
}
int main(){
int i,j;
while (fin>>n){
for (i=0;i<n;i++){
for (j=0;j<n;j++){
fin>>x[i][j];
}
}
for (i=0;i<n;i++){
for (j=0;j<n;j++){
fin>>y[i][j];
}
}
Trans1(z,x);
if (isOK(z,y)){
fout<<1<<endl;
continue;
}
Trans2(z,x);
if (isOK(z,y)){
fout<<2<<endl;
continue;
}
Trans3(z,x);
if (isOK(z,y)){
fout<<3<<endl;
continue;
}
Trans4(z,x);
if (isOK(z,y)){
fout<<4<<endl;
continue;
}
bool f=false;
Trans4(z,x);
for (i=1;i<=3;i++){
Trans5(w,z,i);
if (isOK(w,y)){
fout<<5<<endl;
f=true;
break;
}
}
if (isOK(x,y)){
fout<<6<<endl;
continue;
}
if (!f) fout<<7<<endl;
}
return 0;
}
个人感觉需要注意的地方:
(1)注意旋转之前和旋转之后的位置关系,得到正确的转换方式
(2)将函数封装起来,有助于第五个的判断
(3)我们不应该先判断6,如:
@@@
---
@@@
与
@@@
---
@@@
这两个其实是一样的,但是我们要输出2,因为它得先判断是否能够经过180度旋转得到。