#include <iostream>
using namespace std; #define ROW 12
#define COL 10 class Star
{
public:
enum Stat_star
{
willRemoved = -2,
hasRemoved,
normal
}; Star()
{
for (unsigned i = 0; i < ROW; i++)
{
for (unsigned j = 0; j < COL; j++)
{
m_arr[i][j].state = normal;
m_arr[i][j].visited = false;
}
}
}
~Star(){} void print()
{
cout << "=====================" << endl;
for (unsigned i = 0; i < ROW; i++)
{
for (unsigned j = 0; j < COL; j++)
{cout << m_arr[i][j].data << "(" << m_arr[i][j].state << ")" << "\t";}
cout << endl;
}
} void resetVisited()
{
for (unsigned i = 0; i < ROW; i++)
{
for (unsigned j = 0; j < COL; j++)
{
if(m_arr[i][j].state != hasRemoved)
{m_arr[i][j].visited = false;}
}
}
} //检測是否游戏结束
bool checkGameOver()
{
for (unsigned i = 0; i < ROW; i++)
{
for (unsigned j = 0; j < COL; j++)
{
if(findWillRemove(i, j) > 1)
{return false;}
}
} return true;
} //检測是否要整列移动
void checkColMove()
{
int dt = 0; //列的增量
for (int i = 0; i < COL - dt; i++)
{
bool allRemoved = true;
//检測某列是否整列为空
for (int j = 0; j < ROW; j++)
{
if(m_arr[j][i].state != hasRemoved)
{
allRemoved = false;
break;
}
} //開始移动列
if(allRemoved)
{
for (int x = i; x < COL; x++)
{
for (int y = 0; y < ROW; y++)
{
if(x + 1 < COL)
{
Star_data tempStar = m_arr[y][x];
m_arr[y][x] = m_arr[y][x + 1];
}
}
}
//最后一列置空
for (int y = 0; y < ROW; y++)
{m_arr[y][COL - 1].state = hasRemoved;}
i--;
dt++;
}
}
} //找到同样的球后。删除同样的球
void removeSameStar()
{
//以列来找
for (int j = 0; j < COL; j++)
{
for (int i = ROW - 1; i >= 0; i--)
{
if(m_arr[i][j].state == willRemoved)
{
Star_data tempStar = m_arr[i][j];
//依次把星星下移。而且把空的星星放到最上面
for (int x = i; x >= 0; x--)
{
if(x - 1 >= 0)
{m_arr[x][j] = m_arr[x - 1][j];}
}
m_arr[0][j] = tempStar;
m_arr[0][j].state = hasRemoved;
i++;
}
}
}
}
//点击某个星星。找到将要被移除的星星
int findWillRemove(int i, int j)
{
int findCount = 0;
findWillRemove(i, j, findCount);
resetVisited();
return findCount;
}
//查找将要被移除的
void findWillRemove(int i, int j, int &findCount)
{
if(i >= ROW || i < 0 || j >= COL || j < 0 || m_arr[i][j].state == hasRemoved || m_arr[i][j].visited)
{return;} m_arr[i][j].visited = true;
findCount++; //左
if(i - 1 >= 0 && m_arr[i - 1][j].state != hasRemoved && m_arr[i - 1][j].data == m_arr[i][j].data)
{
m_arr[i][j].state = willRemoved;
m_arr[i - 1][j].state = willRemoved;
findWillRemove(i - 1, j, findCount);
}
//右
if(i + 1 < ROW && m_arr[i + 1][j].state != hasRemoved && m_arr[i + 1][j].data == m_arr[i][j].data)
{
m_arr[i][j].state = willRemoved;
m_arr[i + 1][j].state = willRemoved;
findWillRemove(i + 1, j, findCount);
}
//上
if(j + 1 < COL && m_arr[i][j + 1].state != hasRemoved && m_arr[i][j + 1].data == m_arr[i][j].data)
{
m_arr[i][j].state = willRemoved;
m_arr[i][j + 1].state = willRemoved;
findWillRemove(i, j + 1, findCount);
}
//下
if(j - 1 >= 0 && m_arr[i][j - 1].state != hasRemoved && m_arr[i][j - 1].data == m_arr[i][j].data)
{
m_arr[i][j].state = willRemoved;
m_arr[i][j - 1].state = willRemoved;
findWillRemove(i, j - 1, findCount);
}
} struct Star_data
{
int data; //数据
Stat_star state; //状态
bool visited; //是否訪问
};
Star_data m_arr[ROW][COL];
}; int main()
{
Star star;
int arr[ROW][COL] =
{
2, 1, 3, 2, 1, 2, 1, 3, 2, 1,
2, 2, 5, 1, 2 ,2, 2, 5, 1, 2,
3, 2, 1, 3, 3, 3, 2, 1, 3, 3,
2, 5, 4, 1, 4, 2, 5, 4, 1, 4,
2, 2, 3, 2, 5, 2, 2, 3, 2, 5,
2, 1, 3, 2, 1, 2, 1, 3, 2, 1,
2, 2, 5, 1, 2 ,2, 2, 5, 1, 2,
3, 2, 1, 3, 3, 3, 2, 1, 3, 3,
2, 5, 4, 1, 4, 2, 5, 4, 1, 4,
2, 2, 3, 2, 5, 2, 2, 3, 2, 5,
2, 5, 4, 1, 4, 2, 5, 4, 1, 4,
2, 2, 3, 2, 5, 2, 2, 3, 2, 5
}; for (unsigned i = 0; i < ROW; i++)
{
for (unsigned j = 0; j < COL; j++)
{star.m_arr[i][j].data = arr[i][j];}
} star.print(); star.findWillRemove(0, 0); star.removeSameStar(); star.checkColMove();
star.print(); star.checkGameOver() ? cout <<"over" : cout <<"not over";
system("pause");
return 0;
}

消灭星星的数组高效率算法(c++代码,控制台程序)的更多相关文章

  1. 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法

    1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...

  2. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  3. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  4. 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

    1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...

  5. javascript数组去重算法-----3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Cocos2d-x 3.4 之 消灭星星 &gt; 第三篇(终) &lt;

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  7. php实现构建乘积数组(算法:替换)(语法错误:分号和$符号)

    php实现构建乘积数组(算法:替换)(语法错误:分号和$符号) 一.总结 1.算法:替换 2.语法错误:分号和$符号 二.php实现构建乘积数组 题目描述: 给定一个数组A[0,1,...,n-1], ...

  8. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  9. 【转】Algorithms -离散概率值(discrete)和重置、洗牌(shuffle)算法及代码

    离散概率值(discrete) 和 重置\洗牌(shuffle) 算法 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/1 ...

随机推荐

  1. 可以通过shadowserver来查看开放的mdns(用以反射放大攻击)——中国的在 https://mdns.shadowserver.org/workstation/index.html

    Open mDNS Scanning Project 来自:https://mdns.shadowserver.org/ If you are looking at this page, then m ...

  2. 安卓开发--scrollview

    package com.cnn.scrollviewdemo01; import android.R.integer; import android.annotation.SuppressLint; ...

  3. JS中的switch case

    function GetDepartmentName(type) { switch (type) { case DepartMentQian: alert($('#DepartMentQian').v ...

  4. Python常用目录操作(Python2)

    Python获取当前路径   Python查看指定路径下的文件和文件夹 Python修改当前工作目录(在读取文件等时需要) Python添加import路径(有时候为了import自己写的py文件,且 ...

  5. NodeJS学习笔记 进阶 (5)将图片转成datauri嵌入到html(ok)

    个人总结:这篇文章讲解了使用Node处理转换base64编码图片,读完这篇文章需要5分钟. 摘选自网络 问题:将图片转成datauri 今天,在QQ群有个群友问了个问题:“nodejs读取图片,转成b ...

  6. linux指令快速复制粘贴[龟速更新中]

    由于有经常碰到要输入linux指令,但是却忘记了的情况.在家里我把常用的命令放到Xshell的快速命令集,但是在很多情况下不在家,可能用的他人电脑,以及在非Win环境下使用ssh时没有xshell使用 ...

  7. [Code+#4]最短路 (最短路)

    [Code+#4]最短路 题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如 ...

  8. C#调用C/C++动态库,封装各种复杂结构体

    C#调用C/C++动态库,封装各种复杂结构体. 标签: c++结构内存typedefc# 2014-07-05 12:10 6571人阅读 评论(1) 收藏 举报  分类: C(8)  C#(6)  ...

  9. Liquibase简介(1)

    Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备如下特性: * 不依赖于 ...

  10. 常量成员函数的注意事项 & mutable的使用场景

    mutable的使用场景: 可以在一个const的对象里面,解除对部分字段的const限制.也可以用在const成员函数里面. 对于const与否,一般会调用不同版本的函数: 而对于二元操作符,如果用 ...