sicily 1050 简单魔板

本文深入探讨了在特定操作序列背景下,通过枚举和关键元素定位,判断操作执行次数的方法。利用简单数学运算和逻辑判断,实现了对复杂操作序列的高效解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键是枚举在未发生C操作之前,将第一行第三个数确定为关键字,来判断关键字的位置,来确定进行了多少次C操作。

例如:目标  1  6  2  4              没发生C操作之前的情形为  1  2  3  4 

              8  7  3  5                                                               8  7  6  5

取3做关键字,然后看3在目标情形下的位置,发现只发生了一次C操作;


#include <iostream>


using namespace std;


int main()
{
    int mob[2][4]={{1,2,3,4},{8,7,6,5}};
    int tar[2][4];
    char ans[10];
    int n,i,j,sum1,s,m;
    cin>>n;
    while(n!=-1)
    {
        for(i=0;i<2;i++)
            for(j=0;j<4;j++)
                cin>>tar[i][j];
        sum1=tar[0][0]+tar[0][1]+tar[0][2]+tar[0][3];//算出第一列的和。最简单的就是只进了A B操作;那么行之和只有10和26两种可能;
        if(sum1==10)//行之和为10说明没有换行A操作,只有右移B操作
            {
                for(i=0;i<4;i++)
                    {
                        if(tar[0][i]==1)
                        {
                            s=i;
                            cout<<s<<" ";
                        }


                        ans[i]='B';
                    }
                for(i=0;i<s;i++)
                    cout<<ans[i];
            }
        else if(sum1==26)//行之和为26说明有换行A操作
        {
            ans[0]='A';//先进行换行A操作,注意后面的S要自增一
            for(i=0;i<4;i++)
                    {
                        if(tar[0][i]==8)
                        {
                            s=i+1;//比i大一是因为前面有换行A操作也应该计入步数中
                            cout<<s<<" ";
                        }


                        ans[i+1]='B';
                    }
                for(i=0;i<s;i++)
                    cout<<ans[i];
        }
        if(sum1!=10&&sum1!=26)//既不是10也不是26是说明是发生了C操作
        {
            if(tar[0][0]==1||tar[0][0]==2||tar[0][0]==3||tar[0][0]==4)//即使有C操作,第一行的头和尾可以判断出他是否发生了换行操作
            {
                s=0;//s记录步数
                for(i=3;i>=0;i--)
                {
                    if(mob[0][i]==tar[0][3])
                            break;
                    else if(mob[0][i]!=tar[0][3])//在tar第一行末尾和mob的数比较,来判断右移了多少位
                    {
                                ans[s]='B';
                                s=s+1;
                    }
                }
                if(s==3)//根据右移的次数来确定比较的关键字,就是正常情况下第一行的第三个数,他的位置变化,来判断进行了多少次C操作
                {
                    if(tar[1][2]==4)
                        {
                            ans[s]='C';
                            s=s+1;
                        }
                    if(tar[1][1]==4)
                        {
                            ans[s]='C';
                            ans[s+1]='C';
                            s=s+2;
                        }
                    if(tar[0][1]==4)
                        {
                            ans[s]='C';
                            ans[s+1]='C';
                            ans[s+2]='C';
                            s=s+3;
                        }
                    }
                   else
                   {
                        if(tar[1][2]==3-s)
                            {
                                ans[s]='C';
                                s=s+1;
                            }
                        if(tar[1][1]==3-s)
                            {
                                ans[s]='C';
                                ans[s+1]='C';
                                s=s+2;
                            }
                        if(tar[0][1]==3-s)
                            {
                                ans[s]='C';
                                ans[s+1]='C';
                                ans[s+2]='C';
                                s=s+3;
                            }
                   }
                cout<<s<<" ";
                for(i=0;i<s;i++)
                    cout<<ans[i];
                }
                else
                {
                    s=0;
                    ans[s]='A';
                    s=s+1;
                    for(i=3;i>=0;i--)
                    {
                        if(mob[1][i]==tar[0][3])
                                break;
                        else if(mob[1][i]!=tar[0][3])
                        {
                                ans[s]='B';
                                s=s+1;
                        }
                    }
                if(s==3)
                {
                    if(tar[1][2]==5)
                        {
                            ans[s]='C';
                            s=s+1;
                        }
                    if(tar[1][1]==5)
                        {
                            ans[s]='C';
                            ans[s+1]='C';
                            s=s+2;
                        }
                    if(tar[0][1]==5)
                        {
                            ans[s]='C';
                            ans[s+1]='C';
                            ans[s+2]='C';
                            s=s+3;
                        }
                }
                else
                {
                        if(tar[1][2]==s+6)
                            {
                                ans[s]='C';
                                s=s+1;
                            }
                        if(tar[1][1]==s+6)
                            {
                                ans[s]='C';
                                ans[s+1]='C';
                                s=s+2;
                            }
                        if(tar[0][1]==s+6)
                            {
                                ans[s]='C';
                                ans[s+1]='C';
                                ans[s+2]='C';
                                s=s+3;
                            }
                }
                cout<<s<<" ";
                for(i=0;i<s;i++)
                    cout<<ans[i];
                }
        }
        cin>>n;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值