数据结构题,求女大神求放过解答.

一个C++数据结构的题 求大神解答一下啊_数据结构吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,966贴子:
一个C++数据结构的题 求大神解答一下啊收藏
我选的可能不对 求大神解答啊~~
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或做一道迷宫问题卡住了,求大神解答,关于图的广度优先遍历的_数据结构吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,966贴子:
做一道迷宫问题卡住了,求大神解答,关于图的广度优先遍历的收藏
广度优先遍历能做出输出最短路径,但怎么输出所有路径,代码在下面,麻烦大神解答,最好把改好发给我//基于图的深度和广度优先搜索求解迷宫问题#include &stdio.h&const int MaxSize=100; //迷宫路径的最大长度const int
M=4, N=4;//以下定义邻接表类型typedef struct ANode//边的节点结构类型{
int i,j;//该边的终点位置(i,j)
struct ANode *//指向下一条边的指针} ArcNtypedef struct Vnode//邻接表头节点的类型{
ArcNode *//指向第一条边} VNtypedef struct{
VNode adjlist[M+2][N+2];//邻接表头节点数组} ALG//图的邻接表类型typedef struct{
//当前方块的行号//当前方块的列号//} BOX;int visited[M+2][N+2]={0};int count=0;//总的路径数void CreateList(ALGraph *&G,int mg[][N+2])//建立迷宫数组对应的邻接表G{
int i,j,i1,j1,ArcNode *p;G=new(ALGraph);for (i=0;i&M+2;i++)//给邻接表中所有头节点的指针域置初值for (j=0;j&N+2;j++)G-&adjlist[i][j].firstarc=NULL;
for (i=1;i&=M;i++)//检查mg中每个元素for (j=1;j&=N;j++)if (mg[i][j]==0){
di=0;while (di&4)//找(i,j)方块的四周可走方块{
switch(di){case 0: i1=i-1; j1=j;case 1: i1=i; j1=j+1;case 2: i1=i+1; j1=j;case 3: i1=i; j1=j-1;}if (mg[i1][j1]==0)//(i1,j1)为可走方块{
p=new(ArcNode);
//创建一个节点*p
p-&i=i1; p-&j=j1;
p-&nextarc=G-&adjlist[i][j].
//将*p节点链到链表后
G-&adjlist[i][j].firstarc=p;}di++;}}}void DispAdj(ALGraph *G) //输出邻接表G{int i,j;ArcNode *p;for (i=0;i&M+2;i++)for (j=0;j&N+2;j++){
[%d,%d]: ",i,j);p=G-&adjlist[i][j].while (p!=NULL){
printf("(%d,%d)
",p-&i,p-&j);p=p-&}printf("\n");}}typedef struct{
BOX data[MaxSize];//当前路径的长度} PathT//定义路径类型//基于递归的深度优先搜索,找出所有从(xi, yi)至(xe, ye)的简单路径void findAllPaths_RecurDFS(ALGraph *G,int xi,int yi,int xe,int ye,PathType path){
ArcNode *p;visited[xi][yi]=1;//置已访问标记path.data[path.length].i=path.data[path.length].j=path.length++;if (xi==xe && yi==ye){
迷宫路径%d: ",++count);for (int k=0;k&path.k++)printf("(%d,%d) ",path.data[k].i,path.data[k].j);printf("\n");}p=G-&adjlist[xi][yi]. //p指向顶点v的第一条边顶点while (p!=NULL){
if (visited[p-&i][p-&j]==0) //若(p-&i,p-&j)方块未访问,递归访问它findAllPaths_RecurDFS(G,p-&i,p-&j,xe,ye,path);p=p-&
//p指向顶点v的下一条边顶点}visited[xi][yi]=0;
//恢复环境}//有关栈的函数typedef struct {BOX data[MaxSize];}SqSvoid InitStack(SqStack *&s)
{ s=new SqS s-&top=-1;
bool Push(SqStack *&s, BOX e) {if(s-&top==MaxSize-1)s-&top++;s-&data[s-&top]=e; } bool Pop(SqStack *&s, BOX &e) {if(s-&top==-1)e=s-&data[s-&top];s-&top--; } bool GetTop(SqStack *&s, BOX &e) {if(s-&top==-1)e=s-&data[s-&top]; }/////////输出路径函数void OutputPath(SqStack *S){for(k=0; k&=S-& k++){printf("(%d,%d) ", S-&data[k].i, S-&data[k].j);}printf("\n");}
//基于非递归的深度优先搜索,找出所有从(xi, yi)至(xe, ye)的简单路径void findAllPaths_DFS(ALGraph *G,int xi,int yi,int xe,int ye){int visited[M+2][N+2];int numOfTries[M+2][N+2];int i,j;for(i=0;i&M+2;i++){for(j=0;j&N+2;j++){visited[i][j]=0;numOfTries[i][j]=0;}}SqStack* S=NULL;InitStack(S);BOXbox.i=box.j=
Push(S,box);visited[xi][yi]=1;while( (S-&top) &=0 ) //栈非空{//begin-while
GetTop(S,box); //取栈顶元素
int x=box.i;int y=box.j;
if(x==xe && y==ye) //已到达出口
OutputPath(S); //Pop(S,box); //出栈
visited[x][y]=0; //复位 }
ArcNode *p=(G-&adjlist[x][y]). //点(x,y)对应的邻接点链表头节点
while(p!=NULL && i++&numOfTries[x][y]) //找下一个可以考虑的邻接点
if(p==NULL) //没有邻接点了{Pop(S,box); //出栈
visited[x][y]=0; //复位numOfTries[x][y]=0; //}else //一个新的邻接点, 考虑探索{numOfTries[x][y]=numOfTries[x][y]+1;
if (visited[p-&i][p-&j]==0) //邻接点可以被真正探索{box.i=p-&i;box.j=p-&j;Push(S,box); //进栈visited[p-&i][p-&j]=1;}}}//end-while}typedef struct{BOX}Q//基于广度优先搜索,找出所有从(xi, yi)至(xe, ye)的简单路径void findAllPaths_BFS(ALGraph *G,int xi,int yi,int xe,int ye){ArcNode *p;BOXint i,j;Quere qu[MaxSize];int front=-1,rear=-1;int visited[M+2][N+2];for(i=0;i&M+2;i++){for(j=0;j&N+2;j++){visited[i][j]=0;}}rear++;qu[rear].box.i=qu[rear].box.j=qu[rear].parent=-1;visited[xi][yi]=1;while(front!=rear){front++;w=qu[front].if(w.i==xe&&w.j==ye){i=while(qu[i].parent!=-1){printf("(%d,%d) ", qu[i].box.i,qu[i].box.j);i=qu[i].}printf("((%d,%d)",qu[i].box.i,qu[i].box.j);}p=G-&adjlist[w.i][w.j].while(p!=NULL){if(visited[p-&i][p-&j]==0){visited[p-&i][p-&j]=1;rear++;qu[rear].box.i=p-&i;qu[rear].box.j=p-&j;qu[rear].parent=}p=p-&}}}/*void automatic_maze(int m,int n) ///自动生成迷宫{int i,j;for(i=0;i&m;i++)for(j=0;j&n;j++)maze[i][j]=rand()%2;
///随机生成0,1maze[0][0]=0;maze[m-1][n-1]=0;}*/int main(){int mg[M+2][N+2]={ {1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1}};ALGraph *G=NULL;CreateList(G,mg);printf("迷宫为:\n");for(int i=0;i&M+2;i++){for(int j=0;j&N+2;j++)printf("%d
",mg[i][j]);printf("\n");}
printf("迷宫对应的邻接表为:\n");DispAdj(G);int xi=1,yi=1,xe=4,ye=4;PathTpath.length=0;printf("所有的迷宫路径为:\n");printf("采用深度优先递归方式求迷宫路径:\n");findAllPaths_RecurDFS(G,xi,yi,xe,ye,path);printf("采用深度优先非递归方式求迷宫路径为:\n");findAllPaths_DFS(G,xi,yi,xe,ye);printf("采用广度优先求迷宫路径为:\n");findAllPaths_BFS(G,xi,yi,xe,ye);return 0;}
关于广度优先的代码在main函数上面,做到现在真心好累,又弄不出
大家帮帮忙哈,弄不出睡不着啊
汝甚屌,令尊知否?
难道不是用队列实现BFS?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或数据结构C语言版,求大神解答。第5.4题_百度知道
提问者采纳
这里是原题。
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
来自团队:
其他类似问题
为您推荐:
数据结构的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁数据结构问题!!求大神!!!第7题答案为啥选c??求详解 _百度作业帮
数据结构问题!!求大神!!!第7题答案为啥选c??求详解
数据结构问题!!求大神!!!第7题答案为啥选c??求详解&
AB正确容易理解。因为栈是先进后出,(注意该题是不带头结点的)所以建立链表使用的是尾插法,删除和插入都是从尾部进行的,所以必须要有尾指针,因为是单向循环,所以只有头结点指针是不能指向尾部的。望采纳~
因为双向循环链表的话,不管标记的结点在表头还是表尾,都可以通过正向或者逆向来找到头结点并对表头进行操作,但是单向链表的话,无法进行逆向操作,如果标记在表头则无法对表头进行删除操作,而又因为是循环链表,标记在表尾的话,顺向指向的就是表头,可以对表头进行任何操作。答题不易,满意请采纳,不懂请追问!O(∩_∩)O谢谢...数据结构问题(求大神指导啊)如果一棵二叉树的先序序列是u1,u2, ,un,中序序列是up1,up2,...upn.试说明若任意两个结点数据域的值都不相同,则可以根据两个结点序列将该二叉树构造出来,并给出_百度作业帮
数据结构问题(求大神指导啊)如果一棵二叉树的先序序列是u1,u2, ,un,中序序列是up1,up2,...upn.试说明若任意两个结点数据域的值都不相同,则可以根据两个结点序列将该二叉树构造出来,并给出
数据结构问题(求大神指导啊)如果一棵二叉树的先序序列是u1,u2, ,un,中序序列是up1,up2,...upn.试说明若任意两个结点数据域的值都不相同,则可以根据两个结点序列将该二叉树构造出来,并给出构造步骤.
http://blog.csdn.net/yunzhongguwu005/article/details/9270085参考这个帖子.通过先序遍历和中序遍历构造二叉树的问题很常见的.

我要回帖

更多关于 数据结构与问题求解 的文章

 

随机推荐