您的位置:首页 > 其它

也谈迷宫算法(最短路径 队列)+源程序

2004-07-09 11:59 639 查看
晕死鸟,原来的有错误哦,改了一个判断条件,加了一个变量。
思路是没错,还是广度优先遍历。

现在改好了,发现错误再请指正:sduboy@163.com

#include <stdlib.h>
#include <stdio.h>
#define ElemType MazePos
typedef struct MazePos0{
int x,y;
}MazePos;
typedef struct maze0{
int s;//pass or wall
MazePos pre;
bool visited;
}Maze;
typedef struct QueueNode{
ElemType data;
struct QueueNode *next;
}queuenode;

typedef struct queue{
struct QueueNode *front;
struct QueueNode *rear;
}Queue;
Maze maze[10][10];
//=============================================
Queue* InitQueue()
{
Queue *q=NULL;
if(!(q=(Queue*)malloc(sizeof(Queue)))) return NULL;
q->front=q->rear=NULL;
return q;
}
bool EnQueue(Queue *q,ElemType data)
{
QueueNode *qn=NULL,*temp=NULL;
if(!q)return false;
if(!(qn=(QueueNode*)malloc(sizeof(QueueNode)))) return false;
qn->data=data;
qn->next=NULL;
if(q->rear)//加入第一各节点时q->rear==NULL
q->rear->next=qn;
q->rear=qn;
if(!q->front)q->front=qn;//同上
return true;
}
bool DeQueue(Queue *q,ElemType *data)
{
QueueNode *qn=NULL;
if(q->front==NULL) return false;
qn=q->front;
q->front=q->front->next;
*data=qn->data;
free(qn);
return true;
}
ElemType GetFrontElem(Queue *q)
{
if(q) return q->front->data;
}
bool QueueEmpty(Queue *q)
{
if(!q->front) return true;
else return false;
}
int ElementsCounts(Queue *q)
{
int i=0;
QueueNode *temp;
temp=q->front;
while(temp){ i++;temp=temp->next;}
return i;
}
//======================
void InitMaze1(Maze maze[10][10])
{

for(int i=1;i<9;i++)
{
for(int j=1;j<9;j++)
maze[i][j].s=1;
printf("/n");
}
maze[2][3].s=0;maze[2][4].s=0;maze[2][5].s=0;maze[3][5].s=0;
maze[4][1].s=0;maze[4][2].s=0;maze[4][3].s=0;maze[4][4].s=0;
maze[1][7].s=0;maze[2][7].s=0;maze[3][7].s=0;maze[5][4].s=0;
maze[6][2].s=0;maze[7][2].s=0;maze[7][3].s=0;maze[7][4].s=0;
maze[7][7].s=0;
maze[7][6].s=0;
maze[6][6].s=0;
//maze[1][5].s=0;

}
void InitMaze2(Maze maze[][10])
{
int i,j;
printf("/n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
maze[i][j].visited=false;
maze[i][j].pre.x=0;
maze[i][j].pre.y=0;

}
printf("/n");
}

}

void PrintMaze(Maze maze[][10])
{
int i,j;
printf("/n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d ",maze[i][j].s);
}
printf("/n");
}
}
//========================
void printpass(Maze maze[][10],int x0,int y0,int x1,int y1)
{ int x,y;
x=x1;y=y1;
while(!((x1==x0)&&(y1==y0)))
{
printf(" (%d,%d) ",x1,y1);
x=maze[x1][y1].pre.x;
y=maze[x1][y1].pre.y;
x1=x;y1=y;
//system("pause");
}
printf(" (%d,%d) ",x0,y0); printf("/n");
}
//==============modified on 12-30-2004=========
bool TravelMaze(Maze maze[][10],int x0,int y0,int x1,int y1)
{
Queue *q=InitQueue();
MazePos pos,tempos;
if(!q) exit(1);
if(maze[x0][y0].s==0)return false;
pos.x=x0;pos.y=y0;
maze[x0][y0].pre.x=x0;maze[x0][y0].pre.y=y0;
maze[x0][y0].visited=true;
EnQueue(q,pos);
while(!QueueEmpty(q) && !maze[x1][y1].visited)

{
tempos=GetFrontElem(q);
x0=tempos.x; y0=tempos.y;
if(maze[x0+1][y0].s==1 && !maze[x0+1][y0].visited)
{ x0++; pos.x=x0;pos.y=y0;EnQueue(q,pos);
maze[x0][y0].visited=true;
maze[x0][y0].pre.x=x0-1;maze[x0][y0].pre.y=y0;}

x0=tempos.x; y0=tempos.y;
if(maze[x0-1][y0].s==1 &&!maze[x0-1][y0].visited)
{ x0--;pos.x=x0;pos.y=y0;EnQueue(q,pos);
maze[x0][y0].visited=true;
maze[x0][y0].pre.x=x0+1;maze[x0][y0].pre.y=y0;}

x0=tempos.x; y0=tempos.y;
if (maze[x0][y0+1].s==1 &&!maze[x0][y0+1].visited)
{ y0++;pos.x=x0;pos.y=y0;EnQueue(q,pos);
maze[x0][y0].visited=true;
maze[x0][y0].pre.x=x0;maze[x0][y0].pre.y=y0-1;}

x0=tempos.x; y0=tempos.y;
if(maze[x0][y0-1].s==1 &&!maze[x0][y0-1].visited)
{ y0--;pos.x=x0;pos.y=y0;EnQueue(q,pos);
maze[x0][y0].visited=true;
maze[x0][y0].pre.x=x0;maze[x0][y0].pre.y=y0+1;}

DeQueue(q,&pos);

}

if(maze[x1][y1].visited){
printpass(maze,1,1,8,8);
return true;
}
else return false;
}
int main()
{
InitMaze1(maze);
InitMaze2(maze);
int entranceX=1, entranceY=1;
int exitX=8, exitY=8;
PrintMaze(maze);

if(!TravelMaze(maze,entranceX,entranceY,exitX,exitY))
printf("Sorry, no solution./n");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: