连连看消除算法

假设连连看棋盘是:

#define 行 11
#define 列 19

棋盘数据是(注意255表示空图标):

255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 001 002 003 004 005 006 007 008 009 008 010 011 012 013 011 014 015 255
255 016 017 018 001 007 019 020 021 022 009 023 019 024 021 025 026 010 255
255 007 015 018 027 024 004 008 012 028 029 030 031 032 017 003 027 033 255
255 034 027 028 015 035 026 019 033 036 034 005 009 025 025 037 013 015 255
255 037 017 038 023 036 039 014 011 255 013 016 033 001 011 009 040 022 255
255 017 004 038 035 040 019 040 002 041 033 007 026 012 013 014 014 025 255
255 024 023 018 040 037 016 008 005 036 002 018 001 034 039 035 039 041 255
255 005 030 030 003 038 039 024 041 035 022 020 037 022 003 034 027 010 255
255 004 029 038 031 006 010 030 006 026 002 012 041 036 016 032 023 006 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

坐标是:

 

 

 

算法如下:

bool 能否消除(int 行1,int 列1,int 行2,int 列2)
{
    if(水平消除(行1,列1,行2,列2))
        return true;
    if(垂直消除(行1,列1,行2,列2))
        return true;
    if(一个拐角消除(行1,列1,行2,列2))
        return true;
    if(两个拐角消除(行1,列1,行2,列2))
        return true;
    return false;
}

bool 水平消除(int 行1,int 列1,int 行2,int 列2)
{
    int i;

    if(行1 == 行2)
    {
        for(i = 列1 + 1; i < 列2; i++)   //左往右
        {
            if(num[行1][i] != 255)
            {
                break;
            }
        }
        if(i == 列2)
            return true;
        else
            return false;
    }
    else
        return false;
}

bool 垂直消除(int 行1,int 列1,int 行2,int 列2)
{
    int i;

    if(列1 == 列2)
    {
        for(i = 行1 + 1; i < 行2; i++)   //上往下
        {
            if(num[i][列1] != 255)
            {
                break;
            }
        }
        if(i == 行2)
            return true;
        else
            return false;
    }
    else
        return false;
}

bool 一个拐角消除(int 行1,int 列1,int 行2,int 列2)
{
    if(行1 < 行2 && 列1 > 列2)
    {
        //左下
        if(水平消除(行1,列2-1,行1,列1))
            if(垂直消除(行1,列2,行2,列2))
            {
                return true;
            }

        //下左
        if(垂直消除(行1,列1,行2+1,列1))
            if(水平消除(行2,列2,行2,列1))
            {
                return true;
            }
    }
    else if(行1 < 行2 && 列1 < 列2)
    {
        //右下
        if(水平消除(行1,列1,行1,列2+1))
            if(垂直消除(行1,列2,行2,列2))
            {
                return true;
            }
        //下右
        if(垂直消除(行1,列1,行2+1,列1))
            if(水平消除(行2,列1,行2,列2))
            {
                return true;
            }
    }
    return false;
}

bool 两个拐角消除(int 行1,int 列1,int 行2,int 列2)
{
    int i;

    if(行1 == 行2)
    {
        //上右下
        for(i = 行1-1; i>= 0; i--)
        {
            if(num[i][列1] == 255)
            {
                if(一个拐角消除(i,列1,行2,列2))
                    return true;
            }
            else
                break;
        }
        //下右上
        for(i = 行1+1; i<= 行-1; i++)
        {
            if(num[i][列1] == 255)
            {
                if(一个拐角消除(行2,列2,i,列1))
                    return true;
            }
            else
                break;
        }

    }
    //左下右
    if(列1 == 列2)
    {
        for(i = 列1 - 1; i >= 0; i--)
        {
            if(num[行1][i] == 255)
            {
                if(一个拐角消除(行1,i,行2,列2))
                    return true;
            }
            else
                break;
        }
        //右下左
        for(i = 列1 + 1; i <= 列-1; i++)
        {
            if(num[行1][i] == 255)
            {
                if(一个拐角消除(行1,i,行2,列2))
                    return true;
            }
            else
                break;
        }
    }

    if(行1 < 行2 && 列1 > 列2)
    {
        for(i = 列1 - 1; i >= 0; i--)
        {
            if(num[行1][i] != 255)
                break;
            if(i == 列2)
                continue;
            if(一个拐角消除(行1,i,行2,列2))
                return true;
        }

        for(i = 行1-1; i >= 0; i--)
        {
            if(num[i][列1] != 255)
                break;
            if(一个拐角消除(i,列1,行2,列2))
                return true;
        }

        for(i=行1+1; i<=行-1; i++)
        {
            if(num[i][列1] !=255)
                break;

            if(i == 行2)
                continue;

            if(i < 行2)
            {
                if(一个拐角消除(i,列1,行2,列2))
                    return true;
            }
            else
            {
                if(一个拐角消除(行2,列2,i,列1))
                    return true;
            }

        }

        for(i = 列1+1; i <= 列-1; i++)
        {
            if(num[行1][i] != 255)
                break;
            if(一个拐角消除(行1,i,行2,列2))
                return true;
        }
    }

    if(行1 < 行2 && 列1 < 列2)
    {
        for(i = 列1 + 1; i <= 列-1; i++)
        {
            if(num[行1][i] != 255)
                break;
            if(i == 列2)
                continue;
            if(一个拐角消除(行1,i,行2,列2))
                return true;
        }

        for(i = 列1-1; i >= 0; i--)
        {
            if(num[行1][i] != 255)
                break;
            if(一个拐角消除(行1,i,行2,列2))
                return true;
        }

        for(i=行1+1; i<=行-1; i++)
        {
            if(num[i][列1] !=255)
                break;

            if(i == 行2)
                continue;

            if(i < 行2)
            {
                if(一个拐角消除(i,列1,行2,列2))
                    return true;
            }
            else
            {
                if(一个拐角消除(行2,列2,i,列1))
                    return true;
            }

        }

        for(i = 行1-1; i >= 0; i--)
        {
            if(num[i][列1] != 255)
                break;
            if(一个拐角消除(i,列1,行2,列2))
                return true;
        }
    }

    return false;
}
 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫人生路_SUI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值