队列实现迷宫问题(精装版,可返回路径)
2010-04-16 14:50
316 查看
#define MaxSize 100
#include <stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef struct Elem
{//定义元素数据结构类型
int x;
int y;
int pre;
}Elem;
typedef struct
{
Elem num[MaxSize];//指针数组
int front;
int rear;
//int tag; //front==rear时表示队列满或空的标志:tag==1表示满,tag==0表示空
}LinkQueue;
LinkQueue InitQu(LinkQueue *q)
{
q=(LinkQueue *)malloc(sizeof(LinkQueue));//分配空间
q->front=0;
q->rear=0;
return *q;
}
Elem Delet(LinkQueue *q)
{
return q->num[++(q->front)];
}
LinkQueue EnQueue(LinkQueue *q,int i,int j)//为存入将下一个初始化为(,)
{ q->num[q->rear].pre=q->front;
q->num[q->rear].x=i;
q->num[q->rear].y=j;
q->rear=q->rear+1;
q->num[q->rear].x=0;
q->num[q->rear].y=0;
q->num[q->rear].pre=0;
return *q;
}
int JudguEnd(LinkQueue &Q)
{
if(Q.front>Q.rear) return 0;
}
void FIND(LinkQueue Q)
{ int a[10][10]=
{
0,0,0,0,0,0,0,0,0,0,//0
0,1,1,0,1,1,1,0,1,0,//1
0,1,1,0,1,1,1,0,1,0,//2
0,1,1,1,0,0,0,1,1,0,//3
0,1,0,0,0,1,1,1,1,0,//4
0,1,1,0,0,1,1,1,1,0,//5
0,1,1,1,1,1,0,1,1,0,//6
0,1,0,0,0,1,0,0,1,0,//7
0,0,1,1,1,1,1,1,1,0,//8
0,0,0,0,0,0,0,0,0,0 //9
};
int i=1;
int j=1;
EnQueue(&Q,i,j);
int dx[]={ 1,-1, 0, 0 };//定义两个数组作为坐标循环,使代码简化,
int dy[]={ 0, 0, 1,-1 };
for(int k=0;JudguEnd(Q)!=0;)//一个循环使(i,j)组合的四种情况都具备了
{
if(a[i+dx[k%4]][j+dy[k%4]]==1)
{
EnQueue(&Q,i+dx[k%4],j+dy[k%4]);
a[i+dx[k%4]][j+dy[k%4]]=2;
}
if(i+dx[k%4]==8&&j+dy[k%4]==8)
{
i=i+dx[k%4];j=j+dy[k%4];break;
}
k++;
if (k%4==0)
{
Elem e=Delet(&Q);//定义一个元素类型e,接收Delet(&Q)类型的返回值
i=e.x;
j=e.y;;
}
}
if(i==8&&j==8)
{
printf("此迷宫可通,通路为:/n");
int n=Q.rear-1;
Elem b[100];
int m=-1;
for(;n!=0;)
{
m++;
b[m].x=Q.num
.x;
b[m].y=Q.num
.y;
n=Q.num
.pre;
}
printf("(%d,%d) ",Q.num[0].x,Q.num[0].y);
for(;m+1!=0;)
{
printf("-> (%d,%d) ",b[m].x,b[m].y);
m--;
}
}
else
{
printf("此迷宫不可通");
}
}
void main()
{
LinkQueue Q;
Q=InitQu(&Q);
FIND(Q);
}
#include <stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef struct Elem
{//定义元素数据结构类型
int x;
int y;
int pre;
}Elem;
typedef struct
{
Elem num[MaxSize];//指针数组
int front;
int rear;
//int tag; //front==rear时表示队列满或空的标志:tag==1表示满,tag==0表示空
}LinkQueue;
LinkQueue InitQu(LinkQueue *q)
{
q=(LinkQueue *)malloc(sizeof(LinkQueue));//分配空间
q->front=0;
q->rear=0;
return *q;
}
Elem Delet(LinkQueue *q)
{
return q->num[++(q->front)];
}
LinkQueue EnQueue(LinkQueue *q,int i,int j)//为存入将下一个初始化为(,)
{ q->num[q->rear].pre=q->front;
q->num[q->rear].x=i;
q->num[q->rear].y=j;
q->rear=q->rear+1;
q->num[q->rear].x=0;
q->num[q->rear].y=0;
q->num[q->rear].pre=0;
return *q;
}
int JudguEnd(LinkQueue &Q)
{
if(Q.front>Q.rear) return 0;
}
void FIND(LinkQueue Q)
{ int a[10][10]=
{
0,0,0,0,0,0,0,0,0,0,//0
0,1,1,0,1,1,1,0,1,0,//1
0,1,1,0,1,1,1,0,1,0,//2
0,1,1,1,0,0,0,1,1,0,//3
0,1,0,0,0,1,1,1,1,0,//4
0,1,1,0,0,1,1,1,1,0,//5
0,1,1,1,1,1,0,1,1,0,//6
0,1,0,0,0,1,0,0,1,0,//7
0,0,1,1,1,1,1,1,1,0,//8
0,0,0,0,0,0,0,0,0,0 //9
};
int i=1;
int j=1;
EnQueue(&Q,i,j);
int dx[]={ 1,-1, 0, 0 };//定义两个数组作为坐标循环,使代码简化,
int dy[]={ 0, 0, 1,-1 };
for(int k=0;JudguEnd(Q)!=0;)//一个循环使(i,j)组合的四种情况都具备了
{
if(a[i+dx[k%4]][j+dy[k%4]]==1)
{
EnQueue(&Q,i+dx[k%4],j+dy[k%4]);
a[i+dx[k%4]][j+dy[k%4]]=2;
}
if(i+dx[k%4]==8&&j+dy[k%4]==8)
{
i=i+dx[k%4];j=j+dy[k%4];break;
}
k++;
if (k%4==0)
{
Elem e=Delet(&Q);//定义一个元素类型e,接收Delet(&Q)类型的返回值
i=e.x;
j=e.y;;
}
}
if(i==8&&j==8)
{
printf("此迷宫可通,通路为:/n");
int n=Q.rear-1;
Elem b[100];
int m=-1;
for(;n!=0;)
{
m++;
b[m].x=Q.num
.x;
b[m].y=Q.num
.y;
n=Q.num
.pre;
}
printf("(%d,%d) ",Q.num[0].x,Q.num[0].y);
for(;m+1!=0;)
{
printf("-> (%d,%d) ",b[m].x,b[m].y);
m--;
}
}
else
{
printf("此迷宫不可通");
}
}
void main()
{
LinkQueue Q;
Q=InitQu(&Q);
FIND(Q);
}
相关文章推荐
- 迷宫路径搜索问题(栈的链表实现)
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- c++链表实现队列,深搜加宽搜,加模版类实现迷宫问题;
- 栈和队列的底层实现及迷宫问题
- 数据结构-顺序队列解决最短迷宫路径问题
- 3.10 用栈实现解决迷宫问题(输出一条路径(非最短路径))
- 经典算法<一>迷宫问题 1.单条路径 DFS求解 C++实现
- 队列实现迷宫问题
- 迷宫最短路径的C++实现(队列:广度优先)
- 经典算法<一>迷宫问题 2.单条路径 BFS求解 C++实现
- 算法基础(六):广度优先探索迷宫路径(队列实现!)—超详细版!
- POJ 3984 迷宫问题 手写队列+BFS路径输出
- 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)
- 迷宫最短路径的C++实现(队列:广度优先)
- 队列实现迷宫问题(垃圾版)
- 队列应用2:求解迷宫问题,最短路径
- poj3984迷宫问题 广搜+最短路径+模拟队列
- poj3984迷宫问题 广搜+最短路径+模拟队列
- poj 3984 迷宫问题 【BFS + 优先队列 + stack路径记录】
- 实现迷宫问题的所有路径及最短路径程序