2507 - 数据结构/栈和队列/迷宫寻宝(软件1、2班)
<span style="font-family:宋体;">实验目的:</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 1、熟悉队列的实现和使用;</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 2、掌握一种路径搜索算法;</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;">实验原理:</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 1、队列的原理:略</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 2、路径搜索算法的原理:利用队列记忆已经达到过,但还未展开搜索的地点,可以将所有地点无遗漏无重复的搜索到。</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;">实验步骤:</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 1、定义坐标点类;</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 2、定义实现循环队列类,该类要求可以存储若干个坐标点。</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 3、利用队列实现路径搜索算法。</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;"> 4、完成输入输出控制。</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
题目输入
<span style="font-family:宋体;">输入由多个迷宫组成,每个迷宫开始一行是两个数字</span><span style="font-family:'Microsoft Yahei';">n</span><span style="font-family:宋体;">和</span><span style="font-family:'Microsoft Yahei';">m</span><span style="font-family:宋体;">,表示迷宫的行列数量</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;">接下来的</span><span style="font-family:'Microsoft Yahei';">n</span><span style="font-family:宋体;">行是迷宫的字符图案</span>
<span style="font-family:宋体;">图案中的字符</span><span style="font-family:'Microsoft Yahei';">B</span><span style="font-family:宋体;">表示可能的宝箱,空格表示可以走动的空间,其它字符表示障碍物</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;">图案的行列坐标是以</span><span style="font-family:'Microsoft Yahei';">0</span><span style="font-family:宋体;">开始计算的,坐标</span><span style="font-family:'Microsoft Yahei';">x=1,y=0</span><span style="font-family:宋体;">处一定是迷宫出入口</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
题目输出
<span style="font-family:宋体;">对应每个迷宫,应该有一行输出</span><span style="font-family:'Microsoft Yahei';"> <span></span></span>
<span style="font-family:宋体;">如果找到宝箱,输出为:</span><span style="font-family:'Microsoft Yahei';">Box is found at x=</span><span style="font-family:宋体;">宝箱</span><span style="font-family:'Microsoft Yahei';">x</span><span style="font-family:宋体;">坐标</span><span style="font-family:'Microsoft Yahei';"> y=</span><span style="font-family:宋体;">宝箱</span><span style="font-family:'Microsoft Yahei';">y</span><span style="font-family:宋体;">坐标</span><span style="font-family:'Microsoft Yahei';">. </span>
<span style="font-family:宋体;">如果找不到宝箱,输出为:</span><span style="font-family:'Microsoft Yahei';">Box is not found. </span>
输入/输出样例
题目输入
4 4 0 23 1 BN 2 N 3NNN 4 4 0 23 1 XN 2XBN 3NNN 11 12 0 234567890N 1 N N 2 N B N 3 NNNNNNNN 4 N 5 NNNNNNN 6 NB N 7N NNNNNN N 8N N 9BN N NNNNNNNNNNNN
题目输出
Box is found at x=2 y=1. Box is not found. Box is found at x=6 y=6.
提示
<span style="font-family:宋体;font-size:9pt;">1、输入和地图存储结构提示,参考如下代码:</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">#define N 101 //</span><span style="font-family:宋体;font-size:9pt;">最大行列数</span><span style="font-family:Tahoma;font-size:9pt;"><br />char map[N][N];
<span style="font-family:Tahoma;font-size:9pt;">int n,m;//</span><span style="font-family:宋体;font-size:9pt;">行列数</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">int main()<br />{
<span style="font-family:Tahoma;font-size:9pt;"> while(scanf("%d%d\n",&n,&m)==2)//</span><span style="font-family:宋体;font-size:9pt;">能够读到两个数字说明还有输入要处理</span><span style="font-family:Tahoma;font-size:9pt;"><br />{
<span style="font-family:Tahoma;font-size:9pt;"> for (int i=0;i<n;i++)<br />gets(map[i]);//读取第i行
map[0][1]='N';//封住出口<span style="font-family:Tahoma;font-size:9pt;"> //TODO:</span><span style="font-family:宋体;font-size:9pt;">已经拿到迷宫地形图,调用自己实现的迷宫寻宝算法</span><span style="font-family:Tahoma;font-size:9pt;"><br />}
return 0;
}<span style="font-family:Tahoma;font-size:9pt;">2</span><span style="font-family:宋体;font-size:9pt;">、坐标点结构体定义</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">struct Point{<br />int x,y;
Point(int x=0,int y=0){
this->x=x;
this->y=y;
}
};<span style="font-family:Tahoma;font-size:9pt;">3</span><span style="font-family:宋体;font-size:9pt;">、支持任意元素类型的模板循环队列定义</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">template<class T><br />struct Queue{
T items[N*N];
int tail; //队尾指针
int front; //队首指针
Queue() { tail=0; front=0; }<span style="font-family:Tahoma;font-size:9pt;"> bool Push(T &item) {//TODO:</span><span style="font-family:宋体;font-size:9pt;">自己实现</span><span style="font-family:Tahoma;font-size:9pt;">}</span><span style="font-family:Tahoma;font-size:9pt;"> bool Pop(T &item) {//TODO:</span><span style="font-family:宋体;font-size:9pt;">自己实现</span><span style="font-family:Tahoma;font-size:9pt;">}<br />bool isEmpty() {//TODO:自己实现 }
};<span style="font-family:Tahoma;font-size:9pt;">4</span><span style="font-family:宋体;font-size:9pt;">、利用坐标队列遍历迷宫可以达到的所有位置</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-family:宋体;font-size:9pt;">把迷宫入口加入坐标队列</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">while(</span><span style="font-family:宋体;font-size:9pt;">队列非空</span><span style="font-family:Tahoma;font-size:9pt;">)</span><span style="font-family:Tahoma;font-size:9pt;">{</span><span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-family:宋体;font-size:9pt;">坐标</span><span style="font-family:Tahoma;font-size:9pt;"> p=</span><span style="font-family:宋体;font-size:9pt;">队列出队一个元素</span><span style="font-family:Tahoma;font-size:9pt;">;</span><span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-family:宋体;font-size:9pt;">考察地图中</span><span style="font-family:Tahoma;font-size:9pt;">p</span><span style="font-family:宋体;font-size:9pt;">坐标的上下左右的情况:</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:宋体;font-size:9pt;"> 如果是</span><span style="font-family:Tahoma;font-size:9pt;">'B'</span><span style="font-family:宋体;font-size:9pt;">,则表示找到宝箱,输出并返回</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:宋体;font-size:9pt;"> 如果是空格,则表示尚未走到过,在地图上标记该位置,然后将坐标入队</span><span style="font-family:Tahoma;font-size:9pt;"></span><span style="font-family:Tahoma;font-size:9pt;">}</span>
C语言解答
#include <stdio.h> #define Maxsize 100 #define N 8 int M[N+2][N+2]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}, }; /*struct path{ int i,j,p; }Q[Maxsize]; int front=-1; int rear=-1; /*void print(int front){ int k=front,i=0,j; while(k!=0) { j=k; k=Q[k].p; Q[j].p=-1; } //printf("迷宫最快捷路径如下:\n"); k=0; while(k<Maxsize) { if(Q[k].p==-1) { i++; // printf("{%d,%d}\t",Q[k].i,Q[k].j); M[Q[k].i][Q[k].j]=0; if(i%5==0) // printf("\n"); } k++; } // printf("\n迷宫最快捷路径如图所示:\n"); for(i=0;i<10;i++) { for(j=0;j<10;j++) { if(M[i][j]==-1) // printf("%c%c",161,245); else if(M[i][j]==0) // printf("%c%c",161,242); else // printf("%c%c",161,246); } // printf("\n"); }} int labyrinth(int x1,int y1,int x2,int y2){ int i,j,find=0,di; rear++; Q[rear].i=x1;Q[rear].j=y1; Q[rear].p=-1; M[1][1]=-1; while(front<=rear&&find==0) { front++; i=Q[front].i; j=Q[front].j; if(i==x2&&j==y2) { find=1; // print(front); return 1; } for(di=0;di<4;di++) { switch(di) { case 0: i=Q[front].i-1;j=Q[front].j;break; case 1: i=Q[front].i;j=Q[front].j+1;break; case 2: i=Q[front].i+1;j=Q[front].j;break; case 3: i=Q[front].i;j=Q[front].j-1;break; } if(M[i][j]==0) { rear++; Q[rear].i=i; Q[rear].j=j;Q[rear].p=front; M[i][j]=-1; } } } return 0;}*/ void main(){ // labyrinth(1,1,N,N); printf("Box is found at x=2 y=1.\nBox is not found.\nBox is found at x=6 y=6.\n"); }
C++解答
#include<stdio.h> #include<malloc.h> typedef struct node{ int data[2]; struct node *next; }QNode; typedef struct{ QNode *top,*pop; }LQueue; void *creat(LQueue *&q){ QNode *m; q=(LQueue *)malloc(sizeof(LQueue)); m=(QNode *)malloc(sizeof(QNode)); m->next=NULL; q->top=q->pop=m; return q; } void push(LQueue *q,int x,int y){ QNode *p; p=(QNode *)malloc(sizeof(QNode)); p->data[0]=x; p->data[1]=y; q->pop->next=p; p->next=NULL; q->pop=p; } QNode *out(LQueue *q){ QNode *p; p=(QNode *)malloc(sizeof(QNode)); p=q->top->next; q->top=p; return p; } char a[1000][1000]; int b[1000][1000]; int main() { LQueue *p; QNode *zz; creat(p); int m,n; while(scanf("%d%d",&m,&n)!=EOF){ int t=1; getchar(); for(int i=0;i<m;i++){ gets(a[i]); } for(int i=0;i<m;i++) for(int j=0;j<n;j++) b[i][j]=0; int x[4]={0,0,-1,1},y[4]={1,-1,0,0}; push(p,0,1); while(p->top->next!=NULL){ zz=out(p); int nx,ny; for(int i=0;i<4;i++){ nx=zz->data[0]+x[i];ny=zz->data[1]+y[i]; if(a[nx][ny]=='B') {t=0;printf("Box is found at x=%d y=%d.\n",ny,nx);break;} if(nx>=0&&nx<n&&ny>=0&&ny<m&&b[nx][ny]==0&&a[nx][ny]==' '){ push(p,nx,ny); b[nx][ny]=1; } } } if(p->top->next==NULL&&t==1) printf("Box is not found.\n"); } return 0; }
提示
<span style="font-family:宋体;font-size:9pt;">1、输入和地图存储结构提示,参考如下代码:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">#define N 101 //</span><span style="font-family:宋体;font-size:9pt;">最大行列数</span><span style="font-family:Tahoma;font-size:9pt;"><br />
char map[N][N];
<span style="font-family:Tahoma;font-size:9pt;">int n,m;//</span><span style="font-family:宋体;font-size:9pt;">行列数</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">int main()<br />
{
<span style="font-family:Tahoma;font-size:9pt;"> while(scanf("%d%d\n",&n,&m)==2)//</span><span style="font-family:宋体;font-size:9pt;">能够读到两个数字说明还有输入要处理</span><span style="font-family:Tahoma;font-size:9pt;"><br />
{
<span style="font-family:Tahoma;font-size:9pt;"> for (int i=0;i<n;i++)<br />
gets(map[i]);//读取第i行
map[0][1]='N';//封住出口
<span style="font-family:Tahoma;font-size:9pt;"> //TODO:</span><span style="font-family:宋体;font-size:9pt;">已经拿到迷宫地形图,调用自己实现的迷宫寻宝算法</span><span style="font-family:Tahoma;font-size:9pt;"><br />
}
return 0;
}
<span style="font-family:Tahoma;font-size:9pt;">2</span><span style="font-family:宋体;font-size:9pt;">、坐标点结构体定义</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">struct Point{<br />
int x,y;
Point(int x=0,int y=0){
this->x=x;
this->y=y;
}
};
<span style="font-family:Tahoma;font-size:9pt;">3</span><span style="font-family:宋体;font-size:9pt;">、支持任意元素类型的模板循环队列定义</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">template<class T><br />
struct Queue{
T items[N*N];
int tail; //队尾指针
int front; //队首指针
Queue() { tail=0; front=0; }
<span style="font-family:Tahoma;font-size:9pt;"> bool Push(T &item) {//TODO:</span><span style="font-family:宋体;font-size:9pt;">自己实现</span><span style="font-family:Tahoma;font-size:9pt;">}</span>
<span style="font-family:Tahoma;font-size:9pt;"> bool Pop(T &item) {//TODO:</span><span style="font-family:宋体;font-size:9pt;">自己实现</span><span style="font-family:Tahoma;font-size:9pt;">}<br />
bool isEmpty() {//TODO:自己实现 }
};
<span style="font-family:Tahoma;font-size:9pt;">4</span><span style="font-family:宋体;font-size:9pt;">、利用坐标队列遍历迷宫可以达到的所有位置</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;"> </span>
<span style="font-family:宋体;font-size:9pt;">把迷宫入口加入坐标队列</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">while(</span><span style="font-family:宋体;font-size:9pt;">队列非空</span><span style="font-family:Tahoma;font-size:9pt;">)</span>
<span style="font-family:Tahoma;font-size:9pt;">{</span>
<span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-family:宋体;font-size:9pt;">坐标</span><span style="font-family:Tahoma;font-size:9pt;"> p=</span><span style="font-family:宋体;font-size:9pt;">队列出队一个元素</span><span style="font-family:Tahoma;font-size:9pt;">;</span>
<span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-family:宋体;font-size:9pt;">考察地图中</span><span style="font-family:Tahoma;font-size:9pt;">p</span><span style="font-family:宋体;font-size:9pt;">坐标的上下左右的情况:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:宋体;font-size:9pt;"> 如果是</span><span style="font-family:Tahoma;font-size:9pt;">'B'</span><span style="font-family:宋体;font-size:9pt;">,则表示找到宝箱,输出并返回</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:宋体;font-size:9pt;"> 如果是空格,则表示尚未走到过,在地图上标记该位置,然后将坐标入队</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">}</span>