// roomage.cpp: 主项目文件。
#include "stdafx.h"
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
unsigned int sand(unsigned int (time(0) ) );
/* 按原理来说是可以运用递归实现的,貌似很复杂*/
//template<typename T>
struct room
{
int val;
struct room *east;//东
struct room *south;//南
struct room *west;//西
struct room *north;//北
struct room *up;//上
struct room *down;//下
struct room *seq;//顺时针方向
struct room *ant;//逆时针方向
};//定义一个节点
room* create(int num );
room* huge_create( int num, room* po );
//void out( room* ph );
int main(array<System::String ^> ^args)
{
cout<<"enter number of node on four direction "<<endl;
int num;
cin>>num;
room *po=create( num );
//cout<<sizeof(po)<<endl;//test
cout<<"enter number of node on level direction "<<endl;
int size;
cin>>size;
room* ph=huge_create( size, po );
//out( ph );
这段测试代码证明返回结果正确,说明主链构建成功,子集上的顺逆互联构建成功
//cout<<ph->east->val<<endl;
//cout<<ph->east->up->val<<endl;
//cout<<ph->east->east->down->seq->ant->val<<endl;
//cout<<ph->east->east->down->down->west->val<<endl;// 这段代码证明下面标注的Bug在运行阶段的确出现
system("pause");
return 0;
}
room* create( int num ) //构建上下北南子集,顺逆方向互联
{
static room *p=new room;
p->val=1000;
p->east=p->south =p->west=p->north=p->up=p->down=p->ant=p->seq=NULL;
room *pu=p, *pd=p, *pn=p, *ps=p;
for ( int i=0; i<=num; ++i )
{
room *pu_tmp=new room; //up
pu_tmp->val=200+rand()%200;
pu->up=pu_tmp; pu_tmp->down=pu;
room *pd_tmp=new room;//down
pd_tmp->val=400+rand()%200;
pd->down=pd_tmp; pd_tmp->up=pd;
room *pn_tmp=new room;//north
pn_tmp->val=600+rand()%200;
pn->north=pn_tmp; pn_tmp->south=pn;
room *ps_tmp=new room;//south
ps_tmp->val=800+rand()%200;
ps->south =ps_tmp; ps_tmp->north=ps;
pu=pu->up; pd=pd->down; pn=pn->north; ps=ps->south;
pu->seq=pn; pn->ant=pu;//顺、逆时针方向互联
pn->seq=pd; pd->ant=pn;//顺、逆时针方向互联
pd->seq=ps; ps->ant=pd;//顺、逆时针方向互联
ps->seq=pu; pu->ant=ps;//顺、逆时针方向互联
}
return p;
}
room* huge_create( int size, room* po )
{ room *pf=po;
for ( int i=0; i<=size; ++i )//构建超集,将子集从东向西构建
{
room *pt=create( size );
//cout<<sizeof(pt)<<endl;//test
pf->west=pt; pt->east=pf;//将原超集最西边方向的个体子集与新建的子集用west指针互联
//这段代码出现Bug
room *pfu=pf->up, *pfd=pf->down, *pfn=pf->north, *pfs=pf->south;//上下北南方向
room *ptu=pt->up, *ptd=pt->down, *ptn=pt->north, *pts=pt->south;//上下北南方向
while ( pfu && pfd && pfn && pfs && ptu && ptd && ptn && pts ) //相邻的自己各节点东西互联
{
pfu->west=ptu; ptu->east=pfu;//东西方向互联(上)
pfd->west=ptd; ptd->east=pfd;//东西方向互联(下)
pfn->west=ptn; ptn->east=pfn;//东西方向互联(北)
pfs->west=pts; pts->east=pfs;//东西方向互联(南)
pfu=pfu->up; pfd=pfd->down;//指针上下移动
pfn=pfn->north; pfs=pfs->south;//指针南北移动
ptu=ptu->up; ptd=ptd->down;
ptn=ptn->north; pts=pts->south;
}//while
pf=pf->west;//从东向西构建
}//for
return pf;
}
//void out( room* ph )
//{
// while ( ph )
// {
// cout<<ph->val<<" ";
// ph=ph->east;
// }
//}
/*
//这也是一种思路
class Single
{
private:
room s_obj;
};
class Huge : public Single
{
};
*/
说明: 结点包含平面的东南西北指针,和垂直于东南西北的上下指针,以及东南西北扩展上的顺逆时针方向互联。这样构建成一个子集,通过循环构建超集,并且子集之间的单个结点实现互联,形成建筑物的框架结构,由第一层,依次往上攀升。按说可以递归实现,我做成了循环实现。