USACO 1.2.2 Transformations

本题可以看作是一道几何题,定义了几种基本操作:1.顺时针旋转90度、2.180度、3.270度、4.绕竖直对称轴翻转、5.组合变换(先进行4,再进行1~3中任意一种)、6.不做改变。

题目给定变换之前的图像和变换之后的图像,求让上述一种变换来实现(注意,仅仅是一种),如果有多种,输出编号最小的,如果无解,则输出“7”。

代码写出来还是比较长的,不过思路很清晰。

代码如下:


/*
ID: michael139
LANG: C
PROG: transform
*/
#include<stdio.h>
#include<string.h>
int rot90(char m[][15],char t[][15],int n);
int rot180(char m[][15],char t[][15],int n);
int rot270(char m[][15],char t[][15],int n);
int cmb(char m[][15],char t[][15],int n);
int ref(char m[][15],char t[][15],int n);
int noc(char m[][15],char t[][15],int n);
int main () {
    FILE *fin  = fopen ("transform.in", "r");
    FILE *fout = fopen ("transform.out", "w");
    int n,i,j;
    char be[15][15],af[15][15];
    while (fscanf(fin,"%d",&n)!=EOF) {
        getc(fin);
        for (i=1;i<=n;i++) {
            for (j=1;j<=n;j++) {
                fscanf(fin,"%c",&be[i][j]);
            }
            getc(fin);
        }
        for (i=1;i<=n;i++) {
            for (j=1;j<=n;j++) {
                fscanf(fin,"%c",&af[i][j]);
            }
            getc(fin);
        }
        if (rot90(be,af,n)) {
            fprintf(fout,"1\n");
            continue;
        }
        if (rot180(be,af,n)) {
            fprintf(fout,"2\n");
            continue;
        }
        if (rot270(be,af,n)) {
            fprintf(fout,"3\n");
            continue;
        }
        if (ref(be,af,n)) {
            fprintf(fout,"4\n");
            continue;
        }
        if (cmb(be,af,n)) {
            fprintf(fout,"5\n");
            continue;
        }
        if (noc(be,af,n)) {
            fprintf(fout,"6\n");
            continue;
        }
        fprintf(fout,"7\n");
    }
    return 0;
}
int rot90(char m[][15],char t[][15],int n) {
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            if (t[j][n-i+1]!=m[i][j]) return 0;
        }
    }
    return 1;
}
int rot180(char m[][15],char t[][15],int n) {
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            if (t[n-i+1][n-j+1]!=m[i][j]) return 0;
        }
    }
    return 1;
}
int rot270(char m[][15],char t[][15],int n) {
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            if (t[n-j+1][i]!=m[i][j]) return 0;
        }
    }
    return 1;
}
int ref(char m[][15],char t[][15],int n) {
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            if (t[i][n-j+1]!=m[i][j]) return 0;
        }
    }
    return 1;
}
int cmb(char m[][15],char t[][15],int n) {
    char m2[15][15];
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            m2[i][n-j+1] = m[i][j];
        }
    }
    if (rot90(m2,t,n) || rot180(m2,t,n) || rot270(m2,t,n)) return 1;
    return 0;
}
int noc(char m[][15],char t[][15],int n) {
    int i,j;
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++) {
            if (m[i][j]!=t[i][j]) return 0;
        }
    }
    return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值