my blogs

二维迷宫

今天开始接触广搜,搞了半天还是不甚明白,于是找了一题练练手.

 

#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;
}

 

 

 

posted @ 2010-08-10 16:36  Tim Haver  阅读(273)  评论(0编辑  收藏  举报