二维迷宫
今天开始接触广搜,搞了半天还是不甚明白,于是找了一题练练手.
#include<iostream>
#include<string>
using namespace std;
char a[100][100]; // 符号
int a1[100][100]; // 步数
int b[100][100];// 是否遍历过
int n,m,t1,t2;
int queue[10000][2]; //队列
int x[4]={1,0,-1,0};
int y[4]={0,1,0,-1};
int bfs(int i,int j)
{
int k,tx,ty,cx,cy,head=0,tail=0;
queue[0][0]=i; queue[0][1]=j; b[i][j]=0; a1[i][j]=0;
while(head<=tail)
{
cx=queue[head][0]; cy=queue[head][1];
head++;
if( cx == t1 && cy == t2 ) return a1[ cx ][ cy];
//cout<<t1<<' '<<t2<<endl;
for(k=0;k<4;k++)
{
tx=cx+x[k];
ty=cy+y[k]; //cout<<tx<<' '<<ty<<endl;
if(tx>=0&&tx<m&&ty>=0&&ty<n&&b[tx][ty]&&(a[tx][ty]=='.'||a[tx][ty]=='T'))
{ a1[ tx ][ ty ] =a1[ cx ][ cy ]+1; //cout<<a1[ tx ][ ty ]<<endl;
tail++; queue[tail][0]=tx; queue[tail][1]=ty;
//cout<<tail<<endl;
b[tx][ty]=0;
}
}
}
return 0;
}
int main()
{
int i, j,num;
int g;
while( cin >> m >> n )
{ num=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)b[i][j]=1;
for(i=0;i<m;i++) cin>>a[i];
//cout<<a[0]<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(b[i][j]&&a[i][j]=='T') { t1=i;t2=j;i=m;j=n;}
//cout<<t1<<' '<<t2<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
if(b[i][j]&&a[i][j]=='S') { g = bfs( i, j); i=m;j=n;}
}
cout<<g<<endl;
}
return 0;
}