该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
/*class pose
{
public:
int x;
int y;
int h;
pose(int x,int y,int z)
{
this->x=x;
this->y=y;
this->h=h;
}
};
class type
{
public:
int ord;
pose seat;
int di;
type(int ord,pose curpos,int di)
{
this->ord=ord;
seat=curpos;
this->di=di;
}
};*/
typedef struct
{
int x;
int y;
int h;
}pose;
typedef struct
{int ord;
pose seat;
int di;
}type;
class sqstack
{
public:
type *base;
type *top;
int stacksize;
};
int curstep;
class stack:public sqstack,public type
{
private:
type e;
public:
void initstack(sqstack &s,int n)
{
s.base=new type[n];
if(!s.base)
{
cout<
}
s.top=s.base;
s.stacksize=n;
}
void push(sqstack &s,type e)
{
if(s.top-s.base>=s.stacksize){cout<
*s.top=e;
s.top++;
}
type pop(sqstack &s)
{
if(s.top == s.base)cout<
s.top--;
e=*s.top;
return e;
}
bool test(pose curpos[],int curstep)
{
if(curstep==1)return false;
else
{
for(int i=curstep-1;i>0;i--)
{
if((curpos[i].x==curpos[curstep].x)&&(curpos[i].y==curpos[curstep].y))
{
return true;break;
}
}
if(i==0)return false;
}
}
bool pass(pose curpos[],int n[][10],int curstep)//pose &curpos,
{
if (curpos[curstep].h==1||n[curpos[curstep].y][curpos[curstep].x]==-2)return false;
else if(test(curpos,curstep))
return false;
//(curpos[7].x==curpos[curstep].x)&&(curpos[7].y==curpos[curstep].y)(curpos[7].x==curpos[curstep].x)&&(curpos[7].y==curpos[curstep].y)
else return true;
}
void footprint(pose &curpos)
{
curpos.h=1;
}
void marksprint(pose &curpos)
{
curpos.h=1;
}
void nextpos(pose &curpos1,pose &curpos2,int di)
{
switch (di)
{
case 1:
curpos2.x=curpos1.x+1;curpos2.y=curpos1.y;
break;
case 2:
curpos2.y=curpos1.y+1;curpos2.x=curpos1.x;
break;
case 3:
curpos2.x=curpos1.x-1;curpos2.y=curpos1.y;
break;
case 4:
curpos2.y=curpos1.y-1;curpos2.x=curpos1.x;
break;
default:
cout<
break;
}
}
bool mazepath(int n[10][10],stack m1,sqstack s)//stack m1,
{
//pose curpos;//end;start,
//pose start={1,1,1};pose end(8,8,1);//结构变量的赋值!!!!
pose start={1,1,0};pose end={8,8,1};//结构变量的赋值!!!!
pose *curpos=new pose[100];
for(int i=1;i<100;i++)
{
curpos[i].x=0;
curpos[i].y=0;
curpos[i].h=0;//={0,0,0};
}
curstep=1;
curpos[curstep]=start;
do{
if(m1.pass(curpos,n,curstep))//curpos[curstep],
{
footprint(curpos[curstep]);
type e;
e.di=1;
e.seat=curpos[curstep];
e.ord=curstep;//={curstep,curpos,1};
m1.push(s,e);
if((curpos[curstep].x==end.x)&&(curpos[curstep].y==end.y)) return(true);
curstep++;
m1.nextpos(curpos[curstep-1],curpos[curstep],1);
}
else{
if(!(s.base==s.top))
{
e=pop(s);
while(e.di==4&&!(s.base==s.top))
{
m1.marksprint(e.seat);
e=pop(s);
}
if(e.di<4)
{
e.di++;
m1.push(s,e);
curstep++;
//curpos[curstep].h=1;
m1.nextpos(e.seat,curpos[curstep],e.di);
}
}
}
}while(!(s.base==s.top));
return(false);
};
};
void main()
{
int h;//type n;
sqstack s;
stack m;
cin>>h;
m.initstack(s,h);
//m.initstack(s,h);
cout<
/*for(int i=1;i<=10;i++)
{
cin>>h;
m.push(s,h);
} */
int n[10][10]=
{{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2},
{-2,0,0,-2,0,0,0,-2,0,-2},
{-2,0,0,-2,0,0,0,-2,0,-2},
{-2,0,0,0,0,-2,-2,0,0,-2},
{-2,0,-2,-2,-2,0,0,0,0,-2},
{-2,0,0,0,-2,0,0,0,0,-2},
{-2,0,-2,0,0,0,-2,0,0,-2},
{-2,0,-2,-2,-2,0,-2,-2,0,-2},
{-2,-2,0,0,0,0,0,0,0,-2},
{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2}};
if(m.mazepath(n,m,s))cout<
else cout<
}