方块转换--tsinsen--2018.1.24

D14286. 方块转换

时间限制1.0s    内存限制128.0MB    代码提交间隔1分钟(现在可以提交)  
输入文件名: 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:无效转换:无法用以上方法得到新图案。
  如果有多种可用的转换方法,请选择序号最小的那个。
输入格式
  第一行: 单独的一个整数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;
}//写的不好,输出可以在优化。

反思总结: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];
}//
 ATTENTION:坐标从0开始记
3.编程按题意写,若无准确依据,自己臆想的不可冒险尝试。例如,题中1-7的顺序不可颠倒。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值