D14286. 方块转换
时间限制:
1.0s
内存限制:
128.0MB
输入文件名:
transform.in 输出文件名:
transform.out
试题来源:
NOIP
问题描述
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始
图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
输入格式
第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
3
@-@
---
@@-
@-@
@--
--@
@-@
---
@@-
@-@
@--
--@
输出格式
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的
转换方法。
转换方法。
样例输出
1
分析:这是一道模拟题(复杂);
关键是退出一个图顺时针旋转90度的坐标变换公式。其他即可以此推。
代码:#include<bits/stdc++.h>
using namespace std;
int n;
int pic[20][20],ts[20][20];
void cg(int a[20][20]){//***
int b[111][111];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
b[i][j]=a[n-1-j][i];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}///
void db(int a[20][20]){
int b[20][20];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
int t=a[i][j];
b[i][n-j-1]=t;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}
bool jg(int a[20][20],int b[20][20]){
bool flag=true;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]!=b[i][j])flag=false;
return flag;
}
bool flag=true;
bool printp(int a[20][20],int b[20][20],int c,bool flag){
if(jg(a,b)){
flag=false;return false;
}
return true;
}
bool printt(int a[20][20]){
for(int i=0;i<n;i++)
{ for(int j=0;j<n;j++)
cout<<a[i][j];
cout<<endl;
}
}
void work(){
cin>>n;
int ta[20][20],tt[20][20];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
char ch;cin>>ch;
if(ch=='@')pic[i][j]=1;
else pic[i][j]=0;
ta[i][j]=pic[i][j];tt[i][j]=pic[i][j];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
char ch; cin>>ch;
if(ch=='@')ts[i][j]=1;
else ts[i][j]=0;
}
// printt(pic);printt(ts);
bool flag=true;
cg(ta);if(!printp(ta,ts,1,flag)&&flag){cout<<"1"<<endl;flag=false;}
// printt(ta);
cg(ta);if(!printp(ta,ts,2,flag)&&flag){cout<<"2"<<endl;flag=false;}
cg(ta);if(!printp(ta,ts,3,flag)&&flag){cout<<"3"<<endl;flag=false;}
db(pic);if(!printp(pic,ts,4,flag)&&flag){cout<<"4"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
if( !printp(tt,ts,6,flag)&&flag){cout<<"6"<<endl;flag=false;}
if(flag)cout<<"7"<<endl;
}
int main(){
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
work();
return 0;
}//写的不好,输出可以在优化。
using namespace std;
int n;
int pic[20][20],ts[20][20];
void cg(int a[20][20]){//***
int b[111][111];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
b[i][j]=a[n-1-j][i];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}///
void db(int a[20][20]){
int b[20][20];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
int t=a[i][j];
b[i][n-j-1]=t;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}
bool jg(int a[20][20],int b[20][20]){
bool flag=true;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]!=b[i][j])flag=false;
return flag;
}
bool flag=true;
bool printp(int a[20][20],int b[20][20],int c,bool flag){
if(jg(a,b)){
flag=false;return false;
}
return true;
}
bool printt(int a[20][20]){
for(int i=0;i<n;i++)
{ for(int j=0;j<n;j++)
cout<<a[i][j];
cout<<endl;
}
}
void work(){
cin>>n;
int ta[20][20],tt[20][20];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
char ch;cin>>ch;
if(ch=='@')pic[i][j]=1;
else pic[i][j]=0;
ta[i][j]=pic[i][j];tt[i][j]=pic[i][j];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
char ch; cin>>ch;
if(ch=='@')ts[i][j]=1;
else ts[i][j]=0;
}
// printt(pic);printt(ts);
bool flag=true;
cg(ta);if(!printp(ta,ts,1,flag)&&flag){cout<<"1"<<endl;flag=false;}
// printt(ta);
cg(ta);if(!printp(ta,ts,2,flag)&&flag){cout<<"2"<<endl;flag=false;}
cg(ta);if(!printp(ta,ts,3,flag)&&flag){cout<<"3"<<endl;flag=false;}
db(pic);if(!printp(pic,ts,4,flag)&&flag){cout<<"4"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
cg(pic);if(!printp(pic,ts,5,flag)&&flag){cout<<"5"<<endl;flag=false;}
if( !printp(tt,ts,6,flag)&&flag){cout<<"6"<<endl;flag=false;}
if(flag)cout<<"7"<<endl;
}
int main(){
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
work();
return 0;
}//写的不好,输出可以在优化。
反思总结:1.在函数中要传入一个二维数组。
例:void printp(int a[][])------------wrong错误;
void printp(int a[20][20])------------right正确;(数字为需传入的数组定义时的数字‘依代码’)
2.图顺时针旋转90度的坐标变换公式
void cg(int a[20][20]){//***
int b[111][111];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
b[i][j]=a[n-1-j][i];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}//
int b[111][111];
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
b[i][j]=a[n-1-j][i];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=b[i][j];
}//
ATTENTION:坐标从0开始记
3.编程按题意写,若无准确依据,自己臆想的不可冒险尝试。例如,题中1-7的顺序不可颠倒。