洛谷P2630 题解

我先讲一下我的思路

  1. 将A,B,C,D四种操作用函数储存起来;

  2. 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABCD共19种情况;(这里面一定有遗漏的点,但由于数据太水,所以没有一一列出来)

  3. 对初始矩阵进行上面枚举的操作,如果操作后与最终矩阵相同,便直接输出所对应的枚举的操作;

  4. 如果此时还没有结束程序(即所有操作都枚举完之后,皆不符合最终矩阵),就直接输出“Poland cannot into space!!!”


这是我的局部程序

1.A的操作函数:

int A_operation()
{
    memset(c,0,sizeof(c));//由于要多次用这个转换数组,所以必须清零 
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            c[i][j]=a[3-j+1][i];//按照题目要求进行操作 
        }
    }
    memcpy(a,c,sizeof(a));//将c这个中间 数组里的值拷贝到a数组中 
}

可以看到这里我用了memset和memcpy这两个函数:

memset 是内存赋值函数,比用for来赋值快很多,只是只能赋值常量;

用法:memset(数组名,常量,sizeof(数组名))

memcpy 是内存赋值函数,将一个数组里的值复制到另一个数组中

用法:memcpy(目标数组名,被复制函数名,sizeof(被复制函数名))


2.枚举的操作情况:

memcpy(a,b,sizeof(a));//因为a的值会多次改变,所以b是输入的初始数组,要在每一次枚举的操作后,将a覆盖 
flag=1;//标志,判断是否成功 
A_operation();
A_operation();//进行操作 
for(int i=1;i<=3;i++)
{
    for(int j=1;j<=3;j++)
    {
        if(a[i][j]!=d[i][j])//假如有一个不相同,就跳出循环 
        {
            flag=0;//失败 
            goto p;//跳出循环 
        }
    }
}
p:
if(flag==1)//假如没有失败 
{
    printf("AA");//输出操作 
    return 0; //结束程序 
}

这里有一个新的跳出循环的方法,goto语句(我也是才学的

这个语句与break,continue,return等语句的区别是:

break是跳出一层循环,continue是跳过本次循环,return是结束程序||函数,而goto则是想怎么跳就怎么跳(是不是有点心动了~~~)

用法:goto 语句名

语句名:(要跳到的地方)


直接上程序

#include<bits/stdc++.h>
using namespace std;
int a[4][4],b[4][4],c[4][4],d[4][4];
int flag=1;    
int A_operation()
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            c[i][j]=a[3-j+1][i];
        }
    }
    memcpy(a,c,sizeof(a)); 
}
int B_operation()
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            c[i][j]=a[j][3-i+1];
        }
    }
    memcpy(a,c,sizeof(a));
}

int C_operation()
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            c[i][j]=a[i][3-j+1];
        }
    }
    memcpy(a,c,sizeof(a));
}
int D_operation()
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            c[i][j]=a[3-i+1][j];
        }
    }
    memcpy(a,c,sizeof(a));
}
int main()
{
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            scanf("%d",&d[i][j]);
        }
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto a;
            }
        }
    }
    a:
    if(flag==1)
    {
        printf("A");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    B_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto b;
            }
        }
    }
    b:
    if(flag==1)
    {
        printf("B");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto c;
            }
        }
    }
    c:
    if(flag==1)
    {
        printf("C");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    D_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto d;
            }
        }
    }
    d:
    if(flag==1)
    {
        printf("D");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    A_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto p;
            }
        }
    }
    p:
    if(flag==1)
    {
        printf("AA");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    B_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto e;
            }
        }
    }
    e:
    if(flag==1)
    {
        printf("AB");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto f;
            }
        }
    }
    f:
    if(flag==1)
    {
        printf("AC");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    D_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto g;
            }
        }
    }
    g:
    if(flag==1)
    {
        printf("AD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    B_operation();
    B_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto q;
            }
        }
    }
    q:
    if(flag==1)
    {
        printf("BB");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    B_operation();
    D_operation();          
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto h;
            }
        }
    }
    h:
    if(flag==1)
    {
        printf("BD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    C_operation();
    B_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto i;
            }
        }
    }
    i:
    if(flag==1)
    {
        printf("BC");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    C_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto r;
            }
        }
    }
    r:
    if(flag==1)
    {
        printf("CC");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    C_operation();
    D_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto j;
            }
        }
    }
    j:
    if(flag==1)
    {
        printf("CD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    D_operation();
    D_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto s;
            }
        }
    }
    s:
    if(flag==1)
    {
        printf("DD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    B_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto k;
            }
        }
    }
    k:
    if(flag==1)
    {
        printf("ABC");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    D_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto l;
            }
        }
    }
    l:
    if(flag==1)
    {
        printf("ACD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    B_operation();
    D_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto m;
            }
        }
    }
    m:
    if(flag==1)
    {
        printf("ABD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    D_operation();
    B_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto n;
            }
        }
    }
    n:
    if(flag==1)
    {
        printf("BCD");
        return 0;
    }
    memcpy(a,b,sizeof(a));
    flag=1;
    A_operation();
    D_operation();
    B_operation();
    C_operation();
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j]!=d[i][j])
            {
                flag=0;
                goto o;
            }
        }
    }
    o:
    if(flag==1)
    {
        printf("ABCD");
        return 0;
    }
    printf("Poland cannot into space!!!");//假如上面枚举的情况都不行,就输出(对应4)
    return QWQ
}

转载于:https://www.cnblogs.com/nth-element/p/10604318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值