拼图游戏C++程序改进

1、前一篇介绍的C++程序确实存在问题,我自己在Linux平台上跑出的最终结果有问题,整个程序崩掉了。现在把改进后的程序继续发一下,主要改进的数据结构问题,还有一些地方可能还可以提升效率的地方。欢迎大家提出好的 想法。

#include <list>
#include <string>
#include <iostream>
#include <time.h>
using namespace std;

class DataItem
{
	public:
		 int mPtoC;//1 2 3 4 代表左右上下
		 DataItem* mParent;
		 string mData;
		 DataItem(string data,DataItem* parent,int ptoc) 
		{
			mData=data;
			mParent=parent;
			mPtoC=ptoc;
		}	
};
list<DataItem*> datas;
string swap(string str,int x,int y);
int isExist(string str);
void printPath(DataItem* idx);
int main()
{
	clock_t start,finish;
	int deltax[]={-1,1,0,0};
	int deltay[]={0,0,-1,1};
	string originalstr="573146820";
	string aimstr="123456780";
	DataItem *item=new DataItem(originalstr,NULL,0);
	list<DataItem*>::iterator idx;
	int lineItems=3;
	int count=0;
	datas.clear();
	datas.push_back(item);
	idx=datas.begin();
	cout<<"calulator the result.please waiting ..."<<endl;
	start=clock();
	while(idx!=datas.end())
	{
		int zero_xy=(*idx)->mData.find('0');
		if(count++%1000==0)
			cout<<count<<endl;
		if(zero_xy==8)
		{
			if((*idx)->mData==aimstr)
			{
				//find the answer
				cout<<"the ans pos="<<(*idx)->mParent<<endl;
				printPath(*idx);
				break;
			}
		}
		int zero_x=zero_xy%lineItems;
		int zero_y=zero_xy/lineItems;
		int new_x,new_y;
		for(int i=0;i<4;i++)
		{
			new_x=zero_x+deltax[i];
			new_y=zero_y+deltay[i];
			if(new_x>=0&&new_x<lineItems&&new_y>=0&&new_y<lineItems)
			{
				string str=swap((*idx)->mData,zero_xy, new_y*lineItems+new_x);;
				if(!isExist(str))
				{
					item = new DataItem(str,*idx,i+1);
					datas.push_back(item);
				}
			}
		}
		idx++;
	}
	finish=clock();
	cout<<endl;
	cout<<"the total time = "<<(finish-start)/1000000<<"(s)"<<endl;
	//cout<<aimstr[1]<<endl;
	return 0;
}

string swap(string str,int x,int y)
{
	string str1=str;
	char tmp=str1[x];
	str1[x]=str1[y];
	str1[y]=tmp;
	return str1;
}

int isExist(string str)
{
	list<DataItem*>::iterator i;
	for(i=datas.begin();i!=datas.end();i++)
	{
		if((*i)->mData==str)
			return 1;
	}
	return 0;
}

void printPath(DataItem* idx)
{
	if(idx==*(datas.begin()))
		return;
	cout<<idx->mPtoC;
	printPath(idx->mParent);
}
用G++编译测试的结果,为83秒,-O3优化一些可以提升几十秒的速度,不过具体时间也因电脑而异。还有就是我测试的例子处理的速度相对较少,idx只遍历到了48000多次就出结果了,所以你测试的情况如果比较复杂可能会更耗时。最后补充一下,很多地方并没有加注释,主要是时间比较忙,有需要的可以留言,我在后面更新一下注释,不过细看的话也不难。
发布了35 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ZHOUYONGXYZ/article/details/38657175