ホームページ >バックエンド開発 >C#.Net チュートリアル >【C++楽しいプログラム】Happy Xiaoxiaole

【C++楽しいプログラム】Happy Xiaoxiaole

little bottle
little bottle転載
2019-04-09 15:44:393926ブラウズ

あなたも編集者と同じで、暇なときにいつも携帯電話を手に取り、ミニゲームを開いてプレイするのが好きです。この記事は人気ゲーム Happy Xiaoxiaole の C バージョンの制作過程を紹介していますので、興味のある方はぜひ学んでみてください。

#問題の説明

行列が与えられた場合、除去を達成するためにどのグリッドを移動するかを決定します。 (3つ連続で定義して消去)

ファーウェイの筆記試験問題だそうです。

分析

まず、(i, j) を含むグリッドを削除できるかどうかを判断する関数を作成します。

#次に

#右と下を入れ替えます <span style='font-family: 微软雅黑, "Microsoft YaHei";'># そして、上に書いた関数を呼び出して判断します</span>
交換された 2 つのグリッドが排除されるかどうか。
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>重要なポイントは次のとおりです: </span>トラバース中に後続の入れ替えが繰り返されるため、右と下に入れ替えるだけで済みます。前者は右側の交換が削除されるかどうかを決定し、後者のトラバースは左側の交換が繰り返されるかどうかを決定する必要はありません。

総合的に判断するには、交換した2つのグリッドを解消できるかどうかを判断する必要があります。

  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;
    }
  3. [推奨コース:
C ビデオチュートリアル

]

以上が【C++楽しいプログラム】Happy Xiaoxiaoleの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。