#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. POJ 2528 线段树

    坑: 这道题的坐标轴跟普通的坐标轴是不一样的-- 此题的坐标轴 标号是在中间的-- 线段树建树的时候就不用[l,mid][mid,r]了(这样是错的) 直接[l,mid][mid+1,r]就OK了 D ...

  2. CUDA笔记(11)

    CUDA提供了一种cudaEvent_t的类型,这种类型Event可以统计GPU上面某一个任务或者代码段的精确运行时间 使用常量内存的光线跟踪器的性能比使用全局内存的性能提升了50% __consta ...

  3. Display Video

    ###chromium webrtc视频显示 ###两个数据源:本地数据源: MediaStreamRemoteVideoSource(content/renderer/media/webrtc/me ...

  4. Ubuntu 环境下的mysql 远程访问,redis 远程访问和设置密码 ,mongo 安装 ,设置用户密码,开启远程访问

    MySQL远程访问 1.编辑mysql配置文件,把其中bind-address = 127.0.0.1注释了 vi /etc/mysql/mysql.conf.d/mysqld.cnf 2.使用roo ...

  5. Python解析Socket数据流异常bytes问题

    Python解析Socket数据流异常bytes问题 -- 2019-03-12 python在通过socket发送数据时,英文字符转义后为原来本身的字符,占一个字节(如:s转移后为s),而中文字符在 ...

  6. photoshop快捷键汇总

    图层应用相关快捷键: 复制图层:Ctrl+j 盖印图层:Ctrl+Alt+Shift+E 向下合并图层:Ctrl+E 合并可见图层:Ctrl+Shift+E 激活上一图层:Alt+中括号(]) 激活下 ...

  7. 洛谷—— P1926 小书童——刷题大军

    https://www.luogu.org/problem/show?pid=1926#sub 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人 ...

  8. eclipse调试(debug)弹出错误

    原创:http://www.cnblogs.com/lanhj/p/3874426.html 警告信息: Cannot connect to VM com.sun.jdi.connect.Transp ...

  9. ArcGIS api for javascript——以地理处理结果为条件查询地图

    这里发生什么任务呢?当第一次单击地图,单击的坐标被发送到一个Geoprocessor任务.该任务访问服务器上的通过ArcGIS Server 地理处理服务提供的可用的GIS模型.本例中模型计算驱动时间 ...

  10. HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...