【C++趣味程序】之开心消消乐


本文摘自PHP中文网,作者little bottle,侵删。

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

问题描述

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

据说是华为的笔试题。

分析

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

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

重点是:

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

代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

//

//  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++趣味程序】之开心消消乐的详细内容!

相关阅读 >>

c语言 三种求回文数的算法

C++隐式类型转换是什么?

C++ 判断本机是否有.net环境

详解C++虚成员函数和动态联编

C++如何设置全局变量

C++万能头文件是什么?

C++换行符有哪些

C++总结:面向对象的基本概念

c和C++有什么区别

深入学习C++必读书籍(推荐)

更多相关阅读请进入《C++》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...