#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. 递归神经网络——就是解决AST这样的问题

    原文:https://zybuluo.com/hanbingtao/note/626300 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』: 上图显示了这句话的两个不同的语法 ...

  2. 文件共享服务器nfs搭建过程

    网络文件共享服务器192. yum install -y nfs-utils 在exports文件中添加的从机范围 vim /etc/exports /home/nfs/ (rw,sync,fsid= ...

  3. Kali linux 2016.2(Rolling)中metasploit的搜集特定网站的目录结构

    不多说,直接上干货! parent directory site: testfire.net 至于这里怎么FQ,很简单,请见我下面的博客! kali 2.0安装 lantern(成功FQ) shado ...

  4. miniUI-SelectGrid 弹出选择表格-翻页选中

    介绍 mini中已经给出 弹出表格的里例子 :MiniUi版本 但是在应用过程中遇到写小问题就是没有办法翻页后一并连之前翻页选中的一起提交 以下是解决方案 正文 下面首先介绍  JS 代码 //存储已 ...

  5. Swift学习笔记(3):基本运算符

    目录: 运算符 元组比较 空和运算符 区间运算符 运算符 +, -, *, /, %, =, +=, -=, *=, /= 算术运算符 >, <, ==, >=, <=, != ...

  6. Android EditText+ListPopupWindow实现可编辑的下拉列表

    使用场景 AutoCompleteEditText只有开始输入并且与输入的字符有匹配的时候才弹出下拉列表.Spinner的缺点是不可以编辑.所以本文介绍如何使用EditText+ListPopupWi ...

  7. Saying Good-bye to Cambridge Again

    Saying Good-bye to Cambridge Again Very quietly I take my leave,      As quietly as I came here;     ...

  8. 深入理解JavaScript定时机制

    容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不 ...

  9. HDU 3342 Legal or Not(判断环)

    Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so h ...

  10. 使用python抓取App数据

    App接口爬取数据过程使用抓包工具手机使用代理,app所有请求通过抓包工具获得接口,分析接口反编译apk获取key突破反爬限制需要的工具:夜神模拟器FiddlerPycharm实现过程首先下载夜神模拟 ...