迷宫问题

/*
迷宫问题
输入:
二维数组的行数 M 和 列数 N,以及这个二维数组的所有元素,范例输入: 
3 3
- # #
B - #
# - H


其中,-表示可以通行,#表示有障碍物无法通行,B表示起点,H表示终点


要求:找出从起点到终点的一条路径,若找到输出YES,否则输出NO
输出:
YES
*/


#include <iostream>
//#include <stack>


using namespace std;


struct st{
int x;
int y;
int di;
};
int top=-1;


void mgpath( st s[], char **p, int m, int n,int x1, int y1, int x2, int y2 )
{


top++;
s[top].x=x1;
s[top].y=y1;
s[top].di=-1;
p[x1][y1]='*'; //方块进栈后,将其标志为*表示不可走,退栈后再还原
int i,j,di;
while( top > -1 )
{
i = s[top].x;
j = s[top].y;
di = s[top].di;
if( i==x2 && j==y2)
{ cout << "YES";
return;
}
int find=0;
while( di<4 && find==0 )
{
di++;
switch( di )
{
case 0: i=s[top].x-1; j=s[top].y; break;
case 1: i=s[top].x; j=s[top].y+1; break;
case 2: i=s[top].x+1; j=s[top].y; break;
case 3: i=s[top].x; j=s[top].y-1; break;
}
if(( i>=0 && i<m && j>=0 && j<n ) && ( p[i][j]=='-' || p[i][j]=='H' ) )
find=1;
}
if( find )
{
s[top].di=di;
top++;
s[top].x=i;
s[top].y=j;
s[top].di=-1;
p[i][j]='*';
}
else{
p[ s[top].x ][ s[top].y ]='-';
top--;
 }
}
cout << "NO" <<endl;
return;

}


int main( void )
{
int m, n, x1=-1, y1=-1, x2=-1, y2=-1;
char c;
cin >> m >> n;
if( m<=0 || n<=0 )
{
cout << "illegal input!" <<endl;
return -1;
}
char **p = new char*[ m ];
st *s = new st[m*n];
if( p==NULL || s==NULL )
{
cout << "no enough space!" <<endl;
return -1;
}
for( int i=0; i < m; i++ )
p[i] = new char[n];
for( int i=0; i<m; i++ )
for( int j=0; j<n; j++ )
{
cin >> c;
p[i][j] = c;
if( c=='B')
{
x1=i;
y1=j;
}
else if( c=='H')
{
x2=i;
y2=j;
}


}
if( x1 != -1 && x2 != -1 )
mgpath( s, p, m, n, x1, y1, x2, y2 );
else
{
cout << "illegal input!" <<endl;
for( int i=0; i<m; i++ )
delete [] p[i];
delete [] p;
p = NULL;
return -1;
}

//p指向一系列指针,p[i]指向一系列一维char数组。释放空间时,先释放每个p[i],再释放p。
for( int i=0; i<m; i++ )
delete [] p[i];
delete [] p;
p = NULL;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值