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多次就出结果了,所以你测试的情况如果比较复杂可能会更耗时。最后补充一下,很多地方并没有加注释,主要是时间比较忙,有需要的可以留言,我在后面更新一下注释,不过细看的话也不难。