迷宫问题给一个20×20的迷宫,起点坐标和终点坐标,问从起点是否能到达终点说一下我的想法吧
1 把初始点放入一个队列
2 出队列-获取该点的上下左右坐标,并且是有意义的坐标(不超出边界,不是障碍)
3 将 2 获取的点 判断是不是终点 是结束不是继续
4 将 2 获取的点 加入队列 重复 234步骤
有些细节可以需要注意,可能你要排除重复的点不加入该队列 不然会造成上下点死循环
迷宫问题 C语言,数据结构课设你好
楼主 。
很幸运的看到你的问题 。
但是又很遗憾到现在还没有人回答你的问题 。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦 。
对于你的问题我爱莫能助!
可能是你问的问题有些专业了 。或者别人没有遇到或者接触过你的问题,所以帮不了你 。建议你去问题的相关论坛去求助,那里的人通常比较多,也比较热心,可能能快点帮你解决问题 。
希望我的回答也能够帮到你!
祝你好运 。
快过年了,
最后祝您全家幸福健康快乐每一天!
数据结构课程设计的迷宫问题为什么要运用队和栈呢因为你要保存路线,譬如用栈来处理这个问题 。那么先要清除栈的特性就是FILO(First In Last Out) 。那么就很好的符合了我迷宫的特点,也就是我一直保存迷宫的路径,遇到走不通就退一步(出栈--Pop())这样就可以深度搜索米g哦干路线直到找到或找不到出口
至于用队列,也是一样的道理 。希望能够帮助到你 。
数据结构迷宫问题,程序有错,请问下面的程序应该怎么修改,急?。。?/h2>#include stdio.h
#include malloc.h
#include conio.h
typedef struct pos/*描述迷宫当前位置和方向*/
{
int x;
int y;
int way;/*0:无效,1:左,2:下,3:右,4:上*/
}P;
typedef struct LinkNode/*链表结构,用于栈迷宫问题vb.net的元素类型*/
{
P pos;
struct LinkNode *next;
}LinkNode;
typedef struct stack/*链式栈,用于存储迷宫路径信息*/
{
LinkNode *head;/*头指针*/
}Stack;
int row=0;/*迷宫迷宫问题vb.net的行数*/
int line=0;/*迷宫迷宫问题vb.net的列数*/
void InitStack(Stack *s) /*栈置空*/
{
s-head=NULL;
}
void Push(Stack *s,P p)/*数据入栈*/
{
LinkNode *LN=(LinkNode *)malloc(sizeof(LinkNode));
LN-pos=p;
LN-next=s-head;
s-head=LN;
}
P Pop(Stack *s)/*栈顶元素出栈*/
{
P pos;
LinkNode *LN;
LN=s-head;
s-head=s-head-next;
pos=LN-pos;
delete LN;
return pos;
}
P GetPop(Stack s)/*读取栈顶元素*/
{
return s.head-pos;
}
int Empty(Stack s)/*判空*/
{
if(s.head==NULL)
return 1;
else
return 0;
}
int **InitMaze()/*返回迷宫的二维指针*/
{
int **maze=NULL;
int i;
int j;
printf("请输入迷宫的行跟列(x,y):");
scanf("%d,%d",row,line);/*输入迷宫的行和列*/
maze=(int **)malloc((row 2)*sizeof(int *));
for(i=0;irow 2;i)
{
maze[i]=(int *)malloc(sizeof(int)*(line 2));
}
printf("请输入迷宫\n");/*输入迷宫,1代表路障,0代表通行*/
for(i=1;i=row;i)
for(j=1;j=line;j)
scanf("%d",maze[i][j]);
for(i=0;iline 2;i)/*将迷宫的四周都变为1*/
maze[0][i]=1;
for(i=0;iline 2;i)
maze[row 1][i]=1;
for(i=0;irow 2;i)
maze[i][0]=1;
for(i=0;irow 2;i)
maze[i][line 1]=1;
for(i=0;irow 2;i)/*输出迷宫*/
{
for(j=0;jline 2;j)
printf("=",maze[i][j]);
printf("\n");
}
return maze;
}
void PrintWay(Stack p)/*输出路径*/
{
P pos;
Stack t;/*临时栈,用于存储从入口到出口的路径*/
LinkNode *temp;
int a,b;
InitStack(t);
temp=(LinkNode *)malloc(sizeof(LinkNode));
temp-pos=Pop(p);/*取栈顶元素,即出口*/
Push(t,temp-pos);/*入栈*/
free(temp);
while(!Empty(p))
{
temp=(LinkNode *)malloc(sizeof(LinkNode));
temp-pos=Pop(p);/*获取下一个元素*/
a=GetPop(t).x-temp-pos.x;/*左:a=0,b=1;下:a=1,b=0*/
b=GetPop(t).y-temp-pos.y;/*右:a=0,b=-1上:a=-1,b=0;*/
if(b==1)
temp-pos.way=1;
else if(a==1)
temp-pos.way=2;
else if(b==-1)
temp-pos.way=3;
else if(a==-1)
temp-pos.way=4;
Push(t,temp-pos);/*新位置入栈*/
free(temp);
}
printf("迷宫的路径为:\n");
printf("前两个数字表示位置,最后一个数字表示方向\n");
printf("1表示向左,2表示向下,3表示向右,4表示向上,0表示无方向\n");
while(!Empty(t))/*输出路径*/
{
pos=Pop(t);
printf("=,=,=\n",pos.x,pos.y,pos.way);
}
}
int FindMaze(int **maze,int r,int l) /*寻找路径,找到返回1,没找到返回0*/
{
Stack p,q;/*栈p,q分别表示探索迷宫的路径和过程*/
P temp1,temp2;
int a,b;
InitStack(p);
InitStack(q);
temp1.x=1;
temp1.y=1;//
maze[1][1]=-1;/*标记已经走过*/
Push(p,temp1);
Push(q,temp1);
while(!Empty(q))
{
temp2=GetPop(q);
if(!(GetPop(p).x==GetPop(q).x
GetPop(p).y==GetPop(q).y))
Push(p,temp2);/*若有新元素入栈,就把q的栈顶元素存入p中*/
a=temp2.x;
b=temp2.y 1;/*当前位置左方向相邻的方块*/
if(maze[a][b]==0)
{
temp1.x=a;
temp1.y=b;
maze[a][b]=-1;/*标记已走过*/
Push(q,temp1);
}
if(a==rb==l)/*到达出口*/
{
temp1.way=0;
Push(p,temp1);
PrintWay(p);
return 1;
}
a=temp2.x 1;
b=temp2.y;/*当前位置下方向相邻的方块*/
if(maze[a][b]==0)
{
temp1.x=a;
temp1.y=b;
maze[a][b]=-1;/*标记已走过*/
Push(q,temp1);
}
if(a==rb==l)/*到达出口*/
{
temp1.way=0;
Push(p,temp1);
PrintWay(p);
return 1;
}
a=temp2.x;
b=temp2.y-1;/*当前位置右方向相邻的方块*/
if(maze[a][b]==0)
{
temp1.x=a;
temp1.y=b;
maze[a][b]=-1;/*标记已走过*/
Push(q,temp1);
}
if(a==rb==l)/*到达出口*/
{
temp1.way=0;
Push(p,temp1);
PrintWay(p);
return 1;
}
a=temp2.x-1;
b=temp2.y;/*当前位置上方向相邻的方块*/
if(maze[a][b]==0)
{
temp1.x=a;
temp1.y=b;
maze[a][b]=-1;/*标记已走过*/
Push(q,temp1);
}
if(a==rb==l)/*到达出口*/
{
temp1.way=0;
Push(p,temp1);
PrintWay(p);
return 1;
}
if(GetPop(p).x==GetPop(q).x
GetPop(p).y==GetPop(q).y)/*若四个方向都走不通,则数据出栈,退回一格*/
{
Pop(p);
Pop(q);
}
}
return 0;/*探索迷宫失败*/
}
void main()
{
int **maze=InitMaze();/*初始化迷宫*/
if(FindMaze(maze,row,line))/*探索路径*/
printf("路径探索成功!\n");
else
printf("路径探索失败!\n");
getch();
}
北大ACM3984,请告诉我下面的代码,我打出问号标记出来的那一段是什么意思 。每走一个格加多少并不重要迷宫问题vb.net , 这个值即表示迷宫问题vb.net了每一个步迷宫问题vb.net的开销,如果题中指定了每一步的开销,就按题中说的值来加 , 否则,只要其值能保证计算的正确性就行,对本题来说 , minn的初值为25,当然每次加的量不能使最终的最短距离比minn还大 。LZ标记问号的部分确实冗余 , 没有必要这样写 , 把count;和count--;去掉即可 。
这段代码中,tyr函数没有进行任何有效剪枝,这样的话该函数在数据量较大时将无法工作,所以可以稍加优化:使用一个数组记录当前已知的点到左上角的距离 , 每递归到达一个点,均与该数组中相应的位置比较,如果比之小,则更新该数组,并递归,否则就剪枝 。每一步都可能有4种分支 , 每次递归记录下各自的选择 , 这样在获取更优解时就把当前的选择序列记录下来,就是最终最优解的选择序列 。
迷宫问题#includeiostream
#includefstream
using namespace std;
typedef struct {
int row; //矩阵的行
int col; //矩阵的列
}element;
struct Listnode{//栈结点
element x;//矩阵坐标值
Listnode *next;
};
element move[4]={{0,1},{1,0},{0,-1},{-1,0}};//移动的方向
class Stack{//栈类
public:
Listnode *top;//指向栈顶点的指针
Stack(void){top=NULL;};//构造函数
~Stack(void)//析构函数
{
Listnode *temp;
while(top!=NULL)
{
temp=top;
top=top-next;
delete temp;
}
};
void push(element data);//进栈函数
element pop();//出栈函数
int empty()//栈是否为空 的函数
{
【迷宫问题vb.net 迷宫问题实验报告】if(top==NULL)return 1;
else return 0;
}
};
//进栈函数的实现
void Stack::push(element data)
{
Listnode *temp;
temp=new Listnode;
temp-x.col=data.col;
temp-x.row=data.row;
temp-next=top;
top=temp;
}
//出栈函数的实现
element Stack::pop()
{
element data;
Listnode *temp;
if(top==NULL)
{
cout"error"endl;
}
else
{
temp=top;
top=top-next;
data=https://www.04ip.com/post/temp-x;
delete temp;
return data;
}
}
//求迷宫路径函数
void path(int EXIT_ROW ,int EXIT_COL )
{
int j1,j2;
int** maze;//二维矩阵
maze=new int*[EXIT_ROW 2];//申请二维矩阵空间
for(j1=0;j1EXIT_ROW 2;j1)//申请二维矩阵空间
maze[j1]=new int[EXIT_COL 2];//申请二维矩阵空间
cout"要从文件读入请按Y,否则要从键盘读入请按其他键"endl;
char choice;
cinchoice;
if(choice=='y'||choice=='Y')//从文件中读取数据
{
ifstream input;
input.open("DATA.txt");//打开输入文件
char ch;
if(input.fail())//判断是否打开输入文件成功
{
cout"error"endl;
exit(1);
}
for(j1=1;j1EXIT_ROW 1;j1)//把数据读到矩阵中来
{
for(j2=1;j2EXIT_COL 1;j2)
{
inputch;
maze[j1][j2]=ch-48;
coutmaze[j1][j2]" ";
}
coutendl;
}
input.close();
for(j1=0;j1EXIT_ROW 2;j1)//设置矩阵最左和最右边为1
{
maze[j1][0]=1;
maze[j1][EXIT_COL 1]=1;
}
for(j1=0;j1EXIT_COL 2;j1)//设置矩阵最上和最下为1
{
maze[0][j1]=1;
maze[EXIT_ROW 1][j1]=1;
}
}
else
{
ofstream output;//打开输出文件
output.open("DATA.txt");//打开输出文件
if(output.fail())//判断是否打开输出文件成功
{
cout"error"endl;
exit(1);
}
for(j1=0;j1EXIT_ROW 2;j1)//设置矩阵最左和最右边为1
{
maze[j1][0]=1;
maze[j1][EXIT_COL 1]=1;
}
for(j1=0;j1EXIT_COL 2;j1)//设置矩阵最上和最下为1
{
maze[0][j1]=1;
maze[EXIT_ROW 1][j1]=1;
}
for(j1=1;j1=EXIT_ROW;j1)//从键盘中读入数据到矩阵中
for(j2=1;j2=EXIT_COL;j2)
{
cinmaze[j1][j2];
outputmaze[j1][j2];//把数据也读进去文件,并冲掉原先数据
}
output.close();
}
element temp;
int row,col,next_col,next_row;
int* dir=new int[EXIT_ROW *EXIT_COL];//存储路劲矩阵坐标方向数组
Stack stack;
element data;
data.col=1;data.row=1;
stack.push(data);//把第一个结点进栈
maze[1][1]=-1;//做过的矩阵设置为-1
int start=0;
while(!stack.empty())
{
temp=stack.pop();
row=temp.row;
col=temp.col;
int i=0;
while(i4)
{
next_row=row move[i].row;
next_col=col move[i].col;
if(maze[next_row][next_col]==0)
{
maze[next_row][next_col]=-1;
temp.col=col;
temp.row=row;
dir[start]=i;
stack.push(temp);
col=next_col;
row=next_row;
if((row==EXIT_ROW)(col== EXIT_COL))
{
int x=1,y=1;
int loop;
cout" Entrance"endl;
cout"("x","y","dir[0] 1")--";
for(loop=1;loopstart;loop)
{
x =move[dir[loop-1]].row;
y =move[dir[loop-1]].col;
cout"("x","y","dir[loop] 1")--";
}
x =move[dir[loop-1] ].row;
y =move[dir[loop-1] ].col;
cout"("x","y")";
return ;
}
else i=0;
}
else
i;
}
start--;
}
cout"fail"endl;
}
int main()
{
cout"input end_row and end_col"endl;
int end_row,end_col;
cinend_rowend_col;
path(end_row,end_col);
return 0;
}
//这个我修改好的,完全符合你的要求 , 这个是正确的啊
迷宫问题vb.net的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于迷宫问题实验报告、迷宫问题vb.net的信息别忘了在本站进行查找喔 。
推荐阅读
- 关于obs无人直播声音同步的信息
- 小米6x微信没有视频号,小米6x微信没有视频号怎么办
- 4399动作双人游戏,4399好玩双人游戏
- 男主播直播与照片,男主播帅气头像
- c语言程序的函数体部分 c语言程序函数体的格式
- mysql查询不重复字段条数,mysql不重复的唯一记录
- 放大镜拍摄的房子叫什么,放大镜的房子怎么样
- 一堆旧硬盘怎么处理,老旧硬盘
- go语言app开发例子 go语言开发实例