您的位置:首页 > 其它

sicily 1050 简单魔板

2014-11-06 17:20 253 查看
关键是枚举在未发生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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: