/*****************************************************
WZ ASUST 2016
迷宫问题的两种记录形式
1:test11队列 需要记录后出队列
2:test22栈实现 不需要弹出所记录的坐标(仅无支路时)
第二种 不通过在循环中修改值的方法来展现路径(但还是得先修改为1)
可以在最后 弹出元素并修改所经过的值为其他标识
在写文档中发现 有支路时,就得写弹出部分的代码 弹出无解的坐标
****************************************************/
#include<iomanip>//操纵运算子 setw(2)
// 内部矩阵大小 6*8 加边框后是8*10
#define N 20
typedef int elem_type;
class Stack
{
public:
Stack()
{
top = 0;
size = N;
data = new elem_type[size];
}
~Stack()
{
top = 0;
delete []data;
data = NULL;
}
void IncSize()
{
size = 2*size;
elem_type *p = new elem_type[size];
memcpy(p,data,sizeof(elem_type)*top);
delete []data;
data = p;
}
bool push(elem_type value)
{
if(isfull())
{
IncSize();
}
data[top++] = value;
return true;
}
int gettop()//得到栈顶元素
{
return data[--top];
}
bool isfull()//判断是否已满
{
return top == size;
}
private:
elem_type* data;
int top;
int size;
};
const int ExitX=6;
const int ExitY=8;
using namespace std;
typedef struct QNode
{
int x,y;
struct QNode *next;
}QNode,Queueptr;
typedef struct
{
Queueptr *front;
Queueptr *rear;
}LinkQueue;
//初始化队列
int InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(Queueptr*)malloc(sizeof(QNode));
if(!Q.front) return 0;
Q.front->next=NULL;
return 1;
}
//坐标x,y 入队
int EnQueue(LinkQueue &Q,int x,int y)
{
Queueptr *p;
p=(Queueptr*)malloc(sizeof(QNode));
if(!p) return 0;
p->x=x; p->y=y; p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
//坐标x,y 出队
int DeQueue(LinkQueue &Q,int *x,int *y)
{
Queueptr *p;
p=Q.front->next;
*x=p->x; *y=p->y; Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
int GetHead_x(LinkQueue Q,int *x)
{
*x=Q.front->next->x;
return *x;
}
int GetHead_y(LinkQueue Q,int *y)
{
*y=Q.front->next->y;
return *y;
}
int MAZE[8][10]={ 1,1,1,1,1,1,1,1,1,1,
1,0,0,0,1,1,1,1,1,1,
1,1,1,0,1,1,0,0,1,1,
1,1,1,0,1,1,0,0,1,1,
1,1,1,0,0,0,0,1,1,1,
1,1,1,1,1,1,0,1,1,1,
1,1,1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1};
// 检查是否走到出口
int chkExit(int x,int y,int ex,int ey)
{
if(x==ex && y==ey) return 1;
else return 0;
}
int test11(){
int i,j;
int x=1; //入口
int y=1; //入口
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
cout<<setw(2)<<MAZE[i][j]<<" ";
cout<<endl;
}
LinkQueue Q;
InitQueue(Q);
MAZE[x][y]=1; //入口标记为1
EnQueue(Q,x,y); //
while(1)
{
x=GetHead_x(Q,&x);
y=GetHead_y(Q,&y);
if(chkExit(x,y,ExitX,ExitY)==1) break;
else{
if(MAZE[x-1][y]==0)
{
MAZE[x-1][y]=MAZE[x][y]+1;
EnQueue(Q,(x-1),y);
}
if(MAZE[x+1][y]==0)
{
MAZE[x+1][y]=MAZE[x][y]+1;
EnQueue(Q,(x+1),y);
}
if(MAZE[x][y-1]==0)
{
MAZE[x][y-1]=MAZE[x][y]+1;
EnQueue(Q,x,(y-1));
}
if(MAZE[x][y+1]==0)
{
MAZE[x][y+1]=MAZE[x][y]+1;
EnQueue(Q,x,(y+1));
}
else
{
DeQueue(Q,&x,&y);
}
}
}
cout<<"[test11 所求最短路径!]"<<endl;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
cout<<setw(2)<<MAZE[i][j]<<" ";
cout<<endl;
}
return 0;
}
int test22()
{
int i,j;
int x=1; //入口
int y=1; //入口
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
cout<<setw(2)<<MAZE[i][j]<<" ";
cout<<endl;
}
Stack s;//建立一个栈
MAZE[x][y]=1; //入口标记为1
s.push(x); s.push(y);
MAZE[x][y]=1; //入口标记为1
s.push(x); s.push(y);
while(1)
{
y=s.gettop();
x=s.gettop();
if(chkExit(x,y,ExitX,ExitY)==1) break;
else{
if(MAZE[x-1][y]==0)
{
MAZE[x-1][y]=MAZE[x][y]+1;
s.push(x-1); s.push(y);
}
if(MAZE[x+1][y]==0)
{
MAZE[x+1][y]=MAZE[x][y]+1;
s.push(x+1); s.push(y);
}
if(MAZE[x][y-1]==0)
{
MAZE[x][y-1]=MAZE[x][y]+1;
s.push(x); s.push(y-1);
}
if(MAZE[x][y+1]==0)
{
MAZE[x][y+1]=MAZE[x][y]+1;
s.push(x); s.push(y+1);
}
}
}
cout<<"[ test22 所求最短路径!]"<<endl;
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
cout<<setw(2)<<MAZE[i][j]<<" ";
cout<<endl;
}
return 0;
}
void newMAZE1()
{
time_t t;
srand((unsigned)time(&t));
int k=0;
int r,l;
while(k<20)
{
r=rand()%8;
l=rand()%10;
if(MAZE[r][l]!=0)
{ MAZE[r][l]=0;k++;}
}
}
void newMAZE()
{
int k=0;
while(k<8)
{
MAZE[k][1]=0;k++;
}
k=0;
while(k<10)
{
MAZE[6][k]=0;k++;
}
}
int main()
{
test11();
cout<<endl;
newMAZE();
cout<<endl;
test22();
return 0;
}
//修bug中
栈实现基本都可以 走到支路 然后给支路置1 记录一个栈长度 然后从新再来 得到新的栈 若短就更新栈 最后没有路时就比较 是否有解 有解取最短栈就是最优解
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。