社区讨论

14分,各种情况都试过了都没问题

P1205[USACO1.2] 方块转换 Transformations参与者 5已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@m3e76m34
此快照首次捕获于
2024/11/12 16:35
去年
此快照最后确认于
2025/11/04 14:52
4 个月前
查看原帖
C
#include<stdio.h>
int n;
void a(char k[11][11]);
void b(char k[11][11]);
void c(char k[11][11]);
void d(char k[11][11]);
int compare(char arr1[11][11], char arr2[11][11]);
int main(void)
{
    scanf("%d",&n);
    char first[11][11],final[11][11],atry[11][11],btry[11][11],
    ctry[11][11],dtry[11][11],d1try[11][11],d2try[11][11],d3try[11][11];
    
   
    
    for(int i = 0 ; i < n ; i ++)
    {
       for(int j = 0 ; j < n ; j ++)
       {
            scanf("%c",&first[i][j]);
       } 
       getchar();
    }
    for(int i = 0 ; i < n ; i ++)
    {
       for(int j = 0 ; j < n ; j ++)
       {
            scanf("%c",&final[i][j]);
       } 
       getchar();
    }
    for(int i = 0 ; i < n ; i ++)
    {
       for(int j = 0 ; j < n ; j ++)
       {
            atry[i][j] = first[i][j];
            btry[i][j] = first[i][j];
            ctry[i][j] = first[i][j];
            d1try[i][j] = first[i][j];
            d2try[i][j] = first[i][j];
            d3try[i][j] = first[i][j];
            dtry[i][j] = first[i][j];
       } 
       
    }
    //检测a
    a(atry);
    if(compare(atry,final) == 1)
    {
        printf("1");
        return 0;
    }
    //检测b
    b(btry);
    if(compare(btry,final) == 1)
    {
        printf("2");
        return 0;
    }
    //检测c
    c(ctry);
    if(compare(ctry,final) == 1)
    {
        printf("3");
        return 0;
    }
    //检测d
    d(dtry);
    if(compare(dtry,final) == 1)
    {
        printf("4");
        return 0;
    }
    //检测组合变换
    d(d1try);
    a(d1try);
    if(compare(d1try,final) == 1)
    {
        printf("5");
        return 0;
    }
    d(d2try);
    b(d2try);
    if(compare(d2try,final) == 1)
    {
        printf("5");
        return 0;
    }
    d(d3try);
    c(d3try);
    if(compare(d3try,final) == 1)
    {
        printf("5");
        return 0;
    }
    //检测不变
    if(compare(first,final) == 1)
    {
        printf("6");
        return 0;
    }
    //如果都不行
    printf("7");
    return 0;
}
//修改后的旋转函数
void a(char k[11][11])  // 90度旋转
{
    char temp[11][11];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            temp[i][j] = k[i][j];
    
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            k[j][n-1-i] = temp[i][j];
}
void b(char k[11][11])  // 180度旋转
{
    char temp[11][11];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            temp[i][j] = k[i][j];
    
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            k[n-1-i][n-1-j] = temp[i][j];
}
void c(char k[11][11])  // 270度旋转
{
    char temp[11][11];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            temp[i][j] = k[i][j];
    
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            k[n-1-j][i] = temp[i][j];
}
void d(char k[11][11])  // 水平反射
{
    char temp[11][11];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            temp[i][j] = k[i][j];
    
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            k[i][n-1-j] = temp[i][j];
}
//比较二维数组
int compare(char arr1[11][11], char arr2[11][11]) {
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(arr1[i][j] != arr2[i][j]) 
                return 0;
        }
    }
    return 1;
}
有没有大佬救一下

回复

6 条回复,欢迎继续交流。

正在加载回复...