刚学C++编程一个多月,我就是个渣渣啊,算法啊数据结构啊基础为负。

测试输入为

2//有几次测试
4 5//地图规模,4行5列,都是自己输入的,可以更改的
.D.M.
.DCAE
.AABA
MDDAM//创建地图,'.'代表没有元素
2 3 2 4//交换(2,3)(2,4),注意左上角为(0,0)
2 4 //第二次测试
F.Z.
ZZAZ
1 2 0 2
输出应该为消除了多少个宝石
8//第一次消除了8个,就跟普通的消除游戏一样嘛
4

这个采用最直接打办法解决的宝石迷阵消除算法,里面的代码乱七八糟的,等我学点算法再回来看吧。

#include <iostream>
#include <vector>
#include <algorithm>

#include <cstdlib>
#include <ctime>
using namespace std;

int result = 0;
int judge(char **Map, int row, int col);
void createElement(char **Map, int row, int col);
void showMap(char **Map, int row, int col);
int countSpace(char **Map, int row, int col);

int main()
{
    int testPoint = 0;
    cin >> testPoint;

for ( int i = 0; i < testPoint; ++i)
    {
        int row = 0;
        cin >> row;
        int col = 0;
        cin >> col;

//分配内存
        char **Map = new char*[row +1];
        for (int i = 0; i < row; ++i)
        {
            Map[i] = new char[col + 1];
        }

for (int i = 0; i < row; ++i)
            for (int j =0; j < col; ++j)
            {
                cin >> Map[i][j];
            }

int x1, y1, x2, y2;
        cin >> x1 >> y1;
        cin >> x2 >> y2;

char temp = Map[x1][y1];
        Map[x1][y1] = Map[x2][y2];
        Map[x2][y2] = temp;
       // cout << "Log : exchange.\n";

int first = countSpace(Map, row, col);

int x = judge(Map, row, col);

int last = countSpace(Map, row, col);

cout << last - first << endl;
    }

return 0;
}

int judge(char **Map, int row, int col)
{

vector<char *> vCharTemp;
    //遍历检查是否有需要被删除的元素

//检查每一横排,把三个以上相同的放入容器,做边界检测
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {

if (Map[i][j] == '.')
                continue;
            if (j + 2 >= col)
                continue;
            if (Map[i][j] != Map[i][j+1])
                continue;
            if (Map[i][j] != Map[i][j+2])
                continue;
            vCharTemp.push_back(&Map[i][j]);
            vCharTemp.push_back(&Map[i][j+1]);
            vCharTemp.push_back(&Map[i][j+2]);
            //TODO下一次检测可以直接越过这三个元素
            if (j + 3 < col && Map[i][j] == Map[i][j+3])
            {
                vCharTemp.push_back(&Map[i][j+3]);
                if (j + 4 < col && Map[i][j] ==Map[i][j+4])
                {
                    vCharTemp.push_back(&Map[i][j+4]);
                }
            }
        }
    }

//cout << "Log : check the col.\n";
    //检查每一竖列
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            if (Map[i][j] == '.')
                continue;
            if (i + 2 >= row)
                continue;
            if (Map[i][j] != Map[i+1][j])
                continue;
            if (Map[i][j] != Map[i+2][j])
                continue;
            vCharTemp.push_back(&Map[i][j]);
            vCharTemp.push_back(&Map[i+1][j]);
            vCharTemp.push_back(&Map[i+2][j]);
            if (i + 3 < row && Map[i][j] == Map[i+3][j])
            {
                vCharTemp.push_back(&Map[i+3][j]);
                if (i + 4 < row && Map[i][j] == Map[i+4][j])
                {
                    vCharTemp.push_back(&Map[i+4][j]);
                }
            }
        }
    }

//cout << "Log : check the row.\n";

//根据容器的大小统计这一轮一共消除了多少个,如果存在指向相同的元素的指针只计算一次。
    auto end_unique = unique(vCharTemp.begin(), vCharTemp.end());
    vCharTemp.erase(end_unique, vCharTemp.end());//剔除相同的元素

result += vCharTemp.size();
    if (vCharTemp.size() == 0)//如果容器里面一个元素都没有,则返回结果
    {
        return result;
    }
    //已经将需要消除的放进容器里面了,然后将他们全部置为'.'
    for (auto mem : vCharTemp)
        *mem = '.';
    //cout << "Log : delete the same element.\n";

//现在解决下落的问题,从下往上遍历,如果元素是'.'且上面不是'.'就将他们跟'.'调换
    int cunt = 0;
    do
    {
        cunt++;
        for (int i = row - 1; i > 0; --i)//卧槽这儿写成 ++i了
        {
            for (int j = 0; j < col; ++j)
            {
                //怎么解决连续的'.'呢,从上往下再遍历一次?外面在加一个循环貌似可以解决
                if (Map[i - 1][j] != '.' && Map[i][j] == '.')
                {
                    char temp = Map[i - 1][j];
                    Map[i - 1][j] = Map[i][j];
                    Map[i][j] = temp;
                }
            }
        }
    }while (cunt < row);//直至'.'到最上面
   // cout << "Log : Drop the element.\n";

//现在地图已经重新生成且'.'都在上面,先重新生成新元素替换'.'
    showMap(Map, row, col);
    //createElement(Map, row, col);
    //showMap(Map, row, col);

//递归调用判断新地图是否存在可以消除的元素,直至容器大小为0;

int x = judge(Map, row, col);
    
    for (int i = 0; i < row; ++i)
    {
        delete Map[i];
    }

}

void createElement(char **Map, int row, int col)
{
    srand(time(0));
   // cout << "Log : create new map.\n";
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            if (Map[i][j] == '.')
            {
                int key = rand() % 26;
                Map[i][j] = 'A' + key;
            }
        }
    }
}

void showMap(char **Map, int row, int col)
{
    for (int i = 0; i < row; ++i)
    {
         for(int j = 0; j < col; ++j)
        {
            cout << Map[i][j];
        }
        cout << endl;
    }
    cout << "-----" << endl;
}

int countSpace(char **Map, int row, int col)
{
    int cunt = 0;
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            if (Map[i][j] == '.')
                cunt++;
        }
    }
    return cunt;
}

一个采用BF算法的宝石迷阵的消除解法相关推荐

  1. “宝石迷阵”中游戏算法实现

    [qboy]原创 2013年3月10日 最近有一个想法就是把以前做过我东西都把他以博客的形式写出来,不管对不对,让各位大牛们指点指点.本来想先写"水管猫"的,后来想想先写" ...

  2. 初学Silverlight,用它写了一个小游戏“宝石迷阵”

    游戏在此,鼠标右键可以安装到本地喔! 提示功能需要当前关卡所得分数超过100分才能使用 学习一个东西最好的办法就是去用它.这句话一点没错,通过写这个游戏,确实让我初窥了Silverlight的门径. ...

  3. c语言实现bf算法的定位函数,数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

    数据结构c语言版严蔚敏清华大学出版社第四章串 模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则 ...

  4. KMP算法和BF算法

    串(String)是由零个或多个任意字符组成的有限序列.如下图所示 目录 一.BF算法 二.KMP算法 一.前缀.后缀,最大公共前后缀 二.研究KMP与BF的区别 (主要是回溯) 三.next数组的讲 ...

  5. 用python+pygame写的宝石迷阵小游戏

    寒假的时候没什么意思,索性学了一个脚本语言,当初选定Python也是因为他很强大不仅可以像Ruby一样做网络,也可以像Perl做管理(可能这么比不太对哈~~),其实Python是门很简单的语言,大概一 ...

  6. BF算法优化-------KMP算法

    百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  7. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  8. 数据结构第二版之(课后题)BF算法病毒感染检测

    //vs2013下编译通过.换别的编译器自行补充头文件和修改源代码#include<iostream> #include<fstream> #include <strin ...

  9. python关键字匹配_python通过BF算法实现关键词匹配的方法

    本文实例讲述了python通过BF算法实现关键词匹配的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/python # -*- coding: UTF-8 # filename ...

最新文章

  1. 移动端自动播放音视频实现代码
  2. as本地仓库更改_Android Studio 之 Gradle与Project Structure详解
  3. rust go java 性能_Java,Go和Rust之间的比较 - Dexter
  4. Assigning to Classes CodeForces - 1300B
  5. 不是每个人都适合linux
  6. Python基础案例(一)
  7. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)...
  8. 前端干货之JS最佳实践
  9. 机器人分拣技术与产品提供商“三维通”获2000万元Pre-A轮融资...
  10. 构建程序员快捷代码键盘
  11. 快速上手,教你开发第一个基于 AutoML 的量化投资决策应用
  12. Android学习小Demo(12)TodoList实现ListView的分组实现
  13. 拓端tecdat|R语言:逻辑回归ROC曲线对角线分析过程及结果
  14. vs2019 + vcpkg安装OpenSSL
  15. Hikari连接池——java.lang.Exception: Apparent connection leak detected
  16. js 递归函数(函数自己调用自己)
  17. error: #20: identifier “uint16_t“ is undefined
  18. 1351:面朝大海 春暖花开 [ 数据加强版 ]
  19. 如何实现基于微信小程序的人脸识别
  20. Java项目:基于jsp+mysql+Spring+SpringMVC+mybatis的爱康医院专家预约管理系统

热门文章

  1. uniapp接入友盟(全网唯一 很全!!!)
  2. 计算机显卡怎样安装方法,独立显卡安装简易教程
  3. LOSER_____________实现一到九的乘法表列
  4. 如何用js绘制流星雨特效
  5. net开发过程中,错误集锦
  6. 微信和支付宝又更新了,这几个功能很赞
  7. 京东2015校园招聘技术类笔试题及答案
  8. android 3d城市源码,[转载]android Gallery3D源码分析
  9. stm32项目平衡车详解(stm32F407)下
  10. Article:AI领域2021年度总结与2022年度展望:多模态人工智能起飞、万亿参数模型的爆发、生成模型在音乐电影制作上的进展、Transformer架构正在以一己之力统一AI江湖、AI法律监管