华为机试——CandyBrush游戏

CandyBrush游戏

描述: CandyBrush一款流行的消除游戏,在一个方阵中布满各种糖果,任意交换两个糖果,如果交换后出现横向或者竖向有连续三个相同的情况,则可以消除糖果并得分。
输入25个字符组成的字符串(编号为1到25),表示5×5的方阵,每个字符表示不同类型的糖果(区分大小写),判断是否有解,即交换某两个糖果后能够消除糖果。
举例,下面的方阵无解
T M T M O
X R U C q
A B C X R
U R M T O
T Q C R A
下面的方阵交换(0, 2)和(1, 2)两个糖果后,能消除M
T M T M O
X R M C q
A B C X R
U R M T O
T Q C R A
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号(1到25),比如:上面的方阵中,被交换的糖果,编号最小的为糖果“T”,编号为3。
如果无解,则输出NO。
运行时间限制: 无限制
内存限制: 无限制
输入:
输入个字符组成的字符串,不含空格,表示5×5的方阵
输出:
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号,以空格隔开。如果无解,则输出NO。

样例输入:
TMTMOXRMCqABCXRURMTOTQCRA
样例输出:
YES 3
答案提示:
输出最小糖果编号的意思,就是从左至右,从上到下遍历糖果,找到第一个跟其他交换后能消除的糖果即可。

#include<iostream>
#include<string>
using namespace std;

char a[5][5];
void swap(int i1,int j1,int i2,int j2)
{
    char t=a[i1][j1];
    a[i1][j1]=a[i2][j2];
    a[i2][j2]=t;
}

int xiaochu()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<3;j++)
        {
            if(a[i][j]==a[i][j+1] && a[i][j]==a[i][j+2])
                return 1;
        }

    for(int j=0;j<5;j++)
        for(int i=0;i<3;i++)
        {
            if(a[i][j]==a[i+1][j] && a[i][j]==a[i+2][j])
                return 1;
        }
    return 0;
}
int main()
{
    string str;
    cin>>str;
    int n=0,flag,min;
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
            a[i][j]=str[n++];
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)    //从左到右,从上到下,第一个满足的编号最小,知道陈寻终止
        {
            if(j+1<5)
            {
                swap(i,j,i,j+1);
                flag=xiaochu();
                if(flag==1)
                {
                    min=5*i+j+1;
                    cout<<"Yes "<<min<<endl;
                    return 0;
                }
                swap(i,j,i,j+1);    //不符合时要交换回来,进行下次比较
            }
            if(i+1<5)
            {
                swap(i,j,i+1,j);
                flag=xiaochu();
                if(flag==1)
                {
                    min=i*5+j+1;
                    cout<<"Yes "<<min<<endl;
                    return 0;
                }
                swap(i,j,i+1,j);
            }
        }
    cout<<"NO"<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值