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

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

little bottle
リリース: 2019-04-09 15:45:49
転載
3899 人が閲覧しました

あなたも編集者と同じで、暇なときにいつも携帯電話を手に取り、ミニゲームを開いてプレイするのが好きです。この記事は人気ゲーム 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 サイトの他の関連記事を参照してください。

関連ラベル:
c++
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート