最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 【C++趣味程序】之开心消消乐_C#教程


    你们是否同小编一样,闲暇之余总爱拿起手机,打开小游戏玩一玩。本文就是一款火爆的游戏开心消消乐的C++版的制作过程,有兴趣的小伙伴来了解一下吧!

    问题描述

    给定一个矩阵, 判断移动哪一个格子,可以实现消除。(定义连续三个即可消除)

    据说是华为的笔试题。

    分析

    先写一个函数,判断包含(i, j)的格子是否可能实现消除。

    然后就是向右向下交换,然后调用上面写好的函数判断
    被交换的两个格子是否实现消除。

    重点是:

    1. 只需要向右向下交换,因为遍历的时候,后面的交换会重复。前一个判断了向右交换是否消除,后一个遍历就不需要再判断向左交换是否重复了。
    2. 一定要对被交换的两个格子都判断是否能消除,才能实现全面的判断。

    代码

    //
    //  main.cpp
    //  huawei
    //
    //  Created by SteveWong on 11/10/2016.
    //  Copyright © 2016 SteveWong. All rights reserved.
    //
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <ctime>
    //#include <cstdlib>
    using namespace std;
    
    
    const int LEN = 8;
    
    void pmap(int map[][LEN])
    {
        for (int i = 0; i < LEN; ++i)
        {
            for (int j = 0; j < LEN; ++j)
            {
                cout << map[i][j] << " ";
            }
            cout << endl;
        }
    }
    
    
    
    // 检查以(i,j)为中心的点, 看是否可以消除
    bool check(int map[][LEN], int i, int j)// 保证i、j不越界,
    {
        if (
            (i-1>=0 && i+1<LEN && map[i-1][j]==map[i][j]&&map[i][j]==map[i+1][j])
            || (j-1>=0 && j+1<LEN && map[i][j-1]==map[i][j]&&map[i][j]==map[i][j+1])
            || (i-2>=0 && map[i-2][j]==map[i-1][j]&&map[i-1][j]==map[i][j])
            || (j-2>=0 && map[i][j-2]==map[i][j-1]&&map[i][j-1]==map[i][j])
            || (i+2<LEN && map[i+2][j]==map[i+1][j]&&map[i+1][j]==map[i][j])
            || (j+2<LEN && map[i][j+2]==map[i][j+1]&&map[i][j+1]==map[i][j])
            )
        {
            return true;
        }
        return false;
    }
    
    
    bool swapAndJudge(int m[][LEN], int i, int j)// 保证i、j不越界, 应该对被swap的两个点都做纵向和横向的检查
    {
        int map[LEN][LEN];
        for (int ii = 0; ii < LEN; ++ii)
        {
            for (int jj = 0; jj < LEN; ++jj)
            {
                map[ii][jj] = m[ii][jj];
            }
        }
        // 原来就可以消除
        if (check(map, i, j))
        {
            printf("no need to swap at (%d, %d)\n", i, j);
            return true;
        }
        // 只需要向下换和向右换
        // 向下换
        if (i + 1 < LEN)
        {
            swap(map[i+1][j], map[i][j]);
    
            if (check(map, i, j))
            {
                printf("# swap and sweap! (%d, %d)\n", i, j);
                return true;
            }
            if (check(map, i+1, j))
            {
                printf("# swap and sweap! (%d, %d)\n", i+1, j);
                return true;
            }
    
            swap(map[i+1][j], map[i][j]);// 换回来
        }
    
        // 向右换
        if (j + 1 < LEN)
        {
            swap(map[i][j+1], map[i][j]);
    
            if (check(map, i, j))
            {
                printf("# swap and sweap! (%d, %d)\n", i, j);
                return true;
            }
            if (check(map, i, j+1))
            {
                printf("# swap and sweap! (%d, %d)\n", i, j+1);
                return true;
            }
    
            swap(map[i][j+1], map[i][j]);// 换回来
        }
    
        return false;
    
    }
    
    
    void findMinSwap(int map[][LEN])
    {
        for (int i = 0; i < LEN; ++i)
        {
            for (int j = 0; j < LEN; ++j)
            {
                if (swapAndJudge(map, i, j))
                {
                    printf("gotcha! (%d, %d)\n", i, j);
                }
            }
        }
    }
    
    int main(int argc, const char * argv[]) {
        // insert code here...
    //    std::cout << "Hello, World!\n";
        srand(unsigned(time(0)));
        for (int i = 0; i < LEN; ++i)
        {
            for (int j = 0; j < LEN; ++j)
            {
                map[i][j] = rand() % 5;
            }
        }
        cout << "xiaoxiaole!\n";
        findMinSwap(map);
        pmap(map);
        return 0;
    }

    【推荐课程:C++视频教程

    以上就是【C++趣味程序】之开心消消乐的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1188会员总数(位)
    • 111862资源总数(个)
    • 6本周发布(个)
    • 2 今日发布(个)
    • 248稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    [email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐