Heim  >  Artikel  >  Backend-Entwicklung  >  【C++-Spaßprogramm】Fröhliches Xiaoxiaole

【C++-Spaßprogramm】Fröhliches Xiaoxiaole

little bottle
little bottlenach vorne
2019-04-09 15:44:393882Durchsuche

Bist du wie der Redakteur, greifst du immer gerne zu deinem Handy und öffnest Minispiele, um sie in deiner Freizeit zu spielen. Dieser Artikel beschreibt den Produktionsprozess der C++-Version des beliebten Spiels Happy Xiaoxiaole. Interessierte Freunde können mehr darüber erfahren!

Problembeschreibung

Bestimmen Sie anhand einer Matrix, welches Raster verschoben werden muss, um eine Beseitigung zu erreichen. (definieren Sie drei in einer Reihe, um sie zu eliminieren)

Es soll sich um die schriftliche Testfrage von Huawei handeln.

Analyse

Schreiben Sie zunächst eine Funktion, um zu bestimmen, ob eine Eliminierung des Gitters, das (i, j) enthält, möglich ist.

Dann tauschen Sie <code><span style='font-family: 微软雅黑, "Microsoft YaHei";'>向右向下</span> nach rechts und unten
und rufen Sie dann die oben beschriebene Funktion auf, um zu beurteilen <span style='font-family: 微软雅黑, "Microsoft YaHei";'>被交换的两个格子</span><span style='font-family: 微软雅黑, "Microsoft YaHei";'>Ob die beiden ausgetauschten Gitter </span>

eliminiert werden.

    Der entscheidende Punkt ist:
  1. Sie müssen nur nach rechts und unten wechseln, da beim Überqueren nachfolgende Wechsel wiederholt werden. Der erste Durchlauf bestimmt, ob der rechte Austausch eliminiert wird, und der zweite Durchlauf muss nicht bestimmen, ob der linke Austausch wiederholt wird.
Beurteilen Sie unbedingt, ob die beiden ausgetauschten Gitter eliminiert werden können, um ein umfassendes Urteil zu erhalten.

Code

//
//  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;
}
[Empfohlener Kurs:

C++-Video-Tutorial]

Das obige ist der detaillierte Inhalt von【C++-Spaßprogramm】Fröhliches Xiaoxiaole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen