对对碰(宝石迷阵 Bejeweled)游戏求解算法

原创 2012年03月25日 02:50:57
#include <iostream>=
using namespace std;

const int nGridCount = 8;

int s_color[nGridCount][nGridCount] = {
    34, 92, 26, 34, 93, 10, 34, 39,
    10, 10, 34, 39, 15, 15, 39, 93,
    15, 26, 26, 93, 93, 39, 10, 15,
    26, 34, 39, 15, 39, 34, 34, 26,
    34, 39, 39, 34, 52, 26, 10, 10,
    26, 34, 10, 15, 52, 52, 15, 39,
    93, 15, 26, 26, 15, 39, 93, 93,
    34, 52, 93, 10, 93, 10, 39, 26
};

#define OUTPUT_PAIR(x1, y1, x2, y2) printf("(%d, %d), (%d, %d)\n", x1, y1, x2, y2);\
printf("%d     %d\n", s_color[x1][y1], s_color[x2][y2])

int main()
{
    // 横向地检查一遍
    for (int i = 0; i < nGridCount; i++)
    {
        for (int j = 0; j < nGridCount - 1; j++)
        {
            // xx  |   x |  xx | x   | x xx | xx x
            //   x | xx  | x   |  xx |      |      这些情况的处理
            if ( s_color[i][j] == s_color[i][j+1])
            {

                //   ?
                // xx   检查后端这两个点
                //   ?
                if (i - 1 >= 0 && j + 2 < nGridCount &&
                    s_color[i-1][j+2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+2, i-1, j+2);
                }
                if (i + 1 < nGridCount && j + 2 < nGridCount &&
                    s_color[i+1][j+2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+2, i+1, j+2);
                }

                // ?
                //  xx   检查前端这两个点
                // ?
                if (i - 1 >= 0 && j - 1 >= 0 &&
                    s_color[i-1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-1, i-1, j-1);
                }
                if (i + 1 < nGridCount && j - 1 >= 0 &&
                    s_color[i+1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-1, i+1, j-1);
                }

                // ? xx ? 检查这两个点
                if (j - 2 >= 0 && s_color[i][j-2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-2, i, j-1);
                }
                if (j + 3 < nGridCount && s_color[i][j+3] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+3, i, j+2);
                }
            }
        }

        // x x |  x
        //  x  | x x  这些情况的处理
        for (int j = 0; j < nGridCount - 2; j++)
        {
            if (s_color[i][j] == s_color[i][j+2])
            {
                if (i - 1 >= 0 && s_color[i][j] == s_color[i-1][j+1])
                {
                    OUTPUT_PAIR(i, j+1, i-1, j+1);
                }
                if (i + 1 < nGridCount && s_color[i][j] == s_color[i+1][j+1])
                {
                    OUTPUT_PAIR(i, j+1, i+1, j+1);
                }
            }
        }
    }

    puts("- - - - - - - - - - ");
    // 再纵向地看一遍
    for (int j = 0; j < nGridCount; j++)
    {
        for (int i = 0; i < nGridCount - 1; i++)
        {
            // x  |  x |  x | x
            //  x | x  |  x |  x  这些情况的处理
            //  x | x  | x  |  x
            if ( s_color[i][j] == s_color[i+1][j])
            {

                //  x
                //  x   检查后端这两个点
                // ? ?
                if (j - 1 >= 0 && i + 2 < nGridCount &&
                    s_color[i+2][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+2, j, i+2, j-1);
                }
                if (j + 1 < nGridCount && i + 2 < nGridCount &&
                    s_color[i+2][j+1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+2, j, i+2, j+1);
                }


                // ? ?
                //  x   检查前端这两个点
                //  x
                if (j - 1 >= 0 && i - 1 >= 0 &&
                    s_color[i-1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-1, j, i-1, j-1);
                }
                if (j + 1 < nGridCount && i - 1 >= 0 &&
                    s_color[i-1][j+1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-1, j, i-1, j+1);
                }

                // ? xx ? 检查这两个点
                if (i - 2 >= 0 && s_color[i-2][j] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-2, j, i-1, j);
                }
                if (i + 3 < nGridCount && s_color[i+3][j] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+3, j, i+2, j);
                }
            }
        }

        //  x  | x
        // x   |  x  这些情况的处理
        //  x  | x
        for (int i = 0; i < nGridCount - 2; i++)
        {
            if (s_color[i][j] == s_color[i+2][j])
            {
                if (j - 1 >= 0 && s_color[i][j] == s_color[i+1][j-1])
                {
                    OUTPUT_PAIR(i+1, j, i+1, j-1);
                }
                if (j + 1 < nGridCount && s_color[i][j] == s_color[i+1][j+1])
                {
                    OUTPUT_PAIR(i+1, j, i+1, j+1);
                }
            }
        }
    }
    cin >> ws;
}

宝石排列问题

西安交大 软件53  蔡少斐 题号:5_10 题目叙述: 现有n种不同形状的宝石,每种n颗,共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝...
  • weixin_37517391
  • weixin_37517391
  • 2017年06月12日 10:37
  • 210

排列宝石问题

#include #include #include using namespace std;const int MAX = 50; int n; bool board[MAX][MAX]; //b...
  • u012319493
  • u012319493
  • 2015年11月27日 21:42
  • 514

排列宝石问题回溯算法

问题描述: 现有n种不同形状的宝石,每种n颗,共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝石排列成n行n列的一个方阵,使方阵中每一行和每一列...
  • jiyang_1
  • jiyang_1
  • 2015年11月21日 19:16
  • 1570

拉丁矩阵问题

拉丁矩阵问题     现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m,使矩阵中每一行和每一列的宝石都没有相同的形状。试设计一个算法,计算出对于给定的m和...
  • LDUtyk
  • LDUtyk
  • 2016年12月24日 17:37
  • 794

一个采用BF算法的宝石迷阵的消除解法

刚学C++编程一个多月,我就是个渣渣啊,算法啊数据结构啊基础为负。 测试输入为 2//有几次测试 4 5//地图规模,4行5列,都是自己输入的,可以更改的 .D.M. .DCAE .A...
  • qq_34479368
  • qq_34479368
  • 2016年04月24日 16:19
  • 303

OpenGL红宝石实例程序2-14

1、代码 2、注意事项
  • liminled
  • liminled
  • 2014年07月23日 21:14
  • 1022

用HTML5来开发一款android本地化App游戏-宝石碰碰

本次来说一说如何利用lufylegend.js引擎制作一款HTML5游戏后,将其转换为android本地化的App应用,转换过程其实很简单,下面一步步来做说明。首先来开发一个类似于对对碰的游戏,不过此...
  • lufy_Legend
  • lufy_Legend
  • 2013年03月27日 08:03
  • 34850

排列宝石问题 回溯

问题描述: 现有n种不同形状的宝石,每种n 颗,共n*n颗。同一种形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种 颜色。欲将这n*n颗宝石排列成n行n列的一个方阵,使方阵中每一行...
  • u011980994
  • u011980994
  • 2013年11月27日 14:56
  • 1871

格子类型游戏的总结

像三消属于典型的格子类型的游戏,它其实不难,应该算是基础吧,等你明白了之后,你就会发现国内的那些类型的游戏都比较简单了,所以做游戏,应该是做一类游戏,而不是一款游戏。例如国内有好多三消,出名的有碰碰猫...
  • u012565990
  • u012565990
  • 2015年12月20日 23:00
  • 482

【Android开发】范例4-猜猜宝石放在哪个箱子里

实现"猜猜宝石放在哪个箱子"的小游戏:主界面中有三个箱子,单击其中任意一个箱子,将打开箱子,显示里面是否有宝石,并且将没有被单击的箱子设为半透明显示,被单击的鞋子正常显示,同时根据单击的箱子是否有宝石...
  • u013517797
  • u013517797
  • 2015年04月03日 09:59
  • 1403
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对对碰(宝石迷阵 Bejeweled)游戏求解算法
举报原因:
原因补充:

(最多只允许输入30个字)