消灭星星的数组高效率算法(c++代码,控制台程序)

#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;
}
	
时间: 2025-01-03 00:38:42

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

Cocos2d JS 之消灭星星(九) 处理星星类之——移动和消灭星星

1 /* 2 * 本层拥有处理星星的实例化以及对星星的操作 3 * 1/排列星星 4 * 2/移动和删除星星 5 */ 6 var GameStarLayout = ccui.Layout.extend( 7 { 8 size:null, 9 starArr:[],//存放点击与被点击状态的星星资源 10 starObjArr:[],//存放游戏中星星的二位数组 11 firstTouchStar:null,//第一次选择的星星,用于判断两次选择的星星颜色是否一致 12 isSelected:f

quick cocos2d-x重写消灭星星

之前学习过c++在cocos2d-x游戏引擎上实现的消灭星星游戏,为了熟悉quick cocos2d-x以及Lua语言,我使用2.1.4版本的quick cocos2d-x重写了消灭星星,不过只是实现了其基本的消除,移动,计分以及过关等功能,一些文字漂移.粒子特效等功能有待以后完善. 该游戏的界面非常简单,只有两个场景的切换,首先是一个开始场景,该场景下有一个背景图片以及一个按钮,点击该按钮可以进入到游戏场景界面.开始场景的主要实现代码如下: 1 function MainScene:ctor(

集合框架之数组集合算法

如何检测程序的健康程度? 如果想要知道程序运行所占的CPU和内存的情况可以使用飞行器,这样就可以知道程序的稳定性了.在JDK的bin目录下可以找到飞行器.如下图: 数组集合算法: 1.数组与集合的区别和联系: 数组是有限存储(规定了数组长度就只能存储那么多值),而集合是无限存储,但其实集合也是由数组做成的. 2.数组集合算法的原理: 当向集合里面存储一个值时,集合里面会为其申请一个适当长度的数组来存储,第二次存储值时,如果数组的长度不足以存储第二次的值,就重新申请一个长一点的数组,先把原来的数组

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

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

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

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 满满的泪啊, 从5月22日写的第一篇,于6月6日结束. 中间各种课程.上机.大作业穿插,焦头烂额的, 最后终于做出来差不多的样子了... PS:写博客这几天,宿舍一直停电状态...真是醉了.. 本篇实现的功能: > 粒子特效 > 音乐音效 > 漂浮文字

cocos2d-x 仿 消灭星星(满天星) 源码+解析

今天要写一篇关于cocos2d-x的实战教程, 仿消灭星星(满天星)...... 如果你不知道什么是消灭星星.. 百度! 这是大一刚学cocos2d-x时候写的一个例子,  今天整理文件的时候发现的. 觉得直接丢了怪可惜的, 就稍微整理了下, 写篇教程让大家一起学习. 当然, 在这之前你如果没有cocos2d-x 基础知识... 那么还是先学习了再参考吧. 此篇博文作为cocos2d-x 实战练习, 并非教学教程. 首先, 看下游戏运行效果.                    可以从我的gi

求最大子数组的思想和代码

对于数组ai,最大子数组定义为:ai的和最大的非空连续子数组,很明显,这个概念只对既有正元素,又有负元素的数组有意义,例如,对于ai[16] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7},最大子数组为{18, 20, -7, 12},此时的和为43,求解一个数组的最大子数组的算法依然是使用分治思想,把一个数组一分为二,最大子数组要么在左边,要么在右边,要么在中间,在中间则肯定包含中点,此时便可以从中点的

数组数据分析算法中峰区域的确定

做数据分析算法,使用MATLAB进行算法研究,使用C#进行工程实现比较合适,目前出现这样的情况,有一个数组,经过某种超分辨算法得到的数据点很稀疏,而且峰区域变得又高又细的.所以需要对该区域求和,就涉及到了峰位的确定,进而进行峰区域的确定,这里要注意,必须先确定峰位,再谷位,进而峰区域. matlab实现算法的思路为 1.基于局部极值算法从原始数据数组获取局部极值数组(极大值,极小值,极大值索引,极小值索引): 2.极大值降序排列: 3.查找与极大值的索引最相邻的两个极小值索引,确定峰区域: 4.

最大子数组乘积算法

给出一数组a,求最大子数组乘积 算法思路:用动态垃规划.用maxValue(n)表示从0到n的最大子数组乘积,minValue(n)表示从0到n的最小子数组乘积. 状态转移方程为: minValue(n)= min{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]} maxValue(n)=max{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]} 在求取最大子数组乘积时,更新最大值结果. 代码如下: class S