您的位置:首页 > 其它

迷宫问题

2016-05-06 15:10 190 查看
问题描述

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

问题分析

在这个问题中,从开始位置按照4个方向进行搜索,当这个点没被访问过,或者这个点能够走通,此时将这个点加入到栈当中,每次加入栈中的只是该节点的下一个节点,直到找到目标节点为止,当走到死胡同时候即4个方向都不能走通此时将这个点从栈中删除,弹出下一个顶点。当找到目标节点时,此时栈中的元素,即为从开始节点到目标节点的路径。

问题优化

在随意给定目标节点以及开始节点时,此时可以根据两个节点的位置,设置有限搜索的方向,例如上一个例子,假设开始节点为(0,0),目标节点(4,4),此时可以有限朝右,下方向搜索。

代码

#include<iostream>
#include<stack>
#include<cstring>
#define Max_row 100
#define Max_col 100
using namespace std;
int matrix[Max_row][Max_col];

void maze(int begin_row,int begin_col,int target_row,int target_col,int row,int col)
{
stack<int> Stack,out_stack;
int visit[Max_row][Max_col],h,r,c,Max_length;
memset(visit,0,sizeof(visit));
Max_length=row*col;
Stack.push(begin_row*10+begin_col);
visit[begin_row][begin_col]=1;
while(!Stack.empty())
{
h=Stack.top();
r=h/10;  c=h%10;
if(r==target_row&&c==target_col)    //找到目标节点时,输出路径
{
if(!out_stack.empty())
{
out_stack.pop();
}
stack<int> S(Stack);
if(Stack.size()<Max_length)
{
Max_length=Stack.size();
while(!S.empty())
{
out_stack.push(S.top());
S.pop();
}
}
Stack.pop();
continue;
}
if(matrix[r+1][c]!=1&&r+1<row&&visit[r+1][c]==0) //向下搜
{
Stack.push((r+1)*10+c);
visit[r+1][c]=1;
}
else if(matrix[r-1][c]!=1&&r-1>=0&&visit[r-1][c]==0)//向上搜
{
Stack.push((r-1)*10+c);
visit[r-1][c]=1;
}
else if(matrix[r][c+1]!=1&&c+1<col&&visit[r][c+1]==0)//向右搜
{
Stack.push(r*10+c+1);
visit[r][c+1]=1;
}
else if(matrix[r][c-1]!=1&&c-1>=0&&visit[r][c-1]==0)向左搜
{
Stack.push(r*10+c-1);
visit[r][c-1]=1;
}
else                          //遇到死角的时候,回溯到上一个节点
{
Stack.pop();
}
}
while(!out_stack.empty())
{
h=out_stack.top();
cout<<"("<<h/10<<","<<h%10<<")"<<endl;
out_stack.pop();
}
}
int main()
{
int col,row,begin_row,begin_col,target_row,target_col;
cout<<"输入矩阵的行和列:\n";
cin>>row>>col;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
cin>>matrix[i][j];
cout<<"输入开始坐标:\n";
cin>>begin_row>>begin_col;
cout<<"输入目标坐标:\n";
cin>>target_row>>target_col;
maze(begin_row,begin_col,target_row,target_col,row,col);
return 0;
}


$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迷宫问题