hdu 1242BFS 不过+DFS过

来源:互联网 发布:nginx安装和配置 编辑:程序博客网 时间:2024/05/04 00:29

/*拿道题就BFS,结果与题意不符,后改DFS

#include<iostream>
#include<queue>
using namespace std;
struct st{
 int x;
 int y;
 int step;
};
char a[201][201];
int b[201][201];
int c[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sx,sy,ex,ey;
int m,n;
bool k;
void bfs(){
// memset(b,0,sizeof(b));
 queue <st> Q;
 st q,s;
 q.x=sx;q.y=sy;q.step=0;
 b[sx][sy]=1;
 Q.push(q);
 while(!Q.empty()){
  s=Q.front();
  if(s.x==ex&&s.y==ey){
   k=1;
   cout<<s.step<<endl;
   return ;
  }
  Q.pop();
  int i;
  for(i=0;i<4;i++){
   q.x=s.x+c[i][0];q.y=s.y+c[i][1];
   if(q.x<0||q.y<0||q.x>=m||q.y>=n) continue;
   if(b[q.x][q.y]==1) continue;
   if(a[q.x][q.y]=='.') q.step=s.step+1;
   else if(a[q.x][q.y]=='x') q.step=s.step+2;
   Q.push(q);b[q.x][q.y]=1;
  }
 }
 return ;
}
int main(){
  freopen("1.txt","r",stdin);
 freopen("2.txt","w",stdout);
 while(cin>>m>>n){
  int i,j;k=0;
  for(i=0;i<m;i++){
   for(j=0;j<n;j++){
    cin>>a[i][j];
    if(a[i][j]=='.'||a[i][j]=='x') b[i][j]=0;
    else if(a[i][j]=='#') b[i][j]=1; 
    else if(a[i][j]=='r') {sx=i;sy=j;}
    else if(a[i][j]=='a') {ex=i;ey=j;}
   }
  }
  bfs();
  if(k==0) cout<<"Poor ANGEL has to stay in the prison all his life. /n";
 }
 return 0;
}*/
***************************************************

#include<iostream>
using namespace std;
char a[201][201];
int c[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int sx,sy,ex,ey;
bool l;int m,n;
int minn=100000;
void dfs(int x,int y,int t){
 int q,p;
// if(x<0||y<0||x>=m||y>=n) return ;
 if(x==ex&&y==ey){
  l=1;
  if(minn>t) minn=t;
  return;
 }
 int i;
 for(i=0;i<4;i++){
  q=x+c[i][0];p=y+c[i][1];
  if(a[q][p]!='#'&& p >= 0 && p < n && q >= 0 && q < m){
  if(a[q][p]=='x'){
   a[q][p]='#';
   dfs(q,p,t+2);
   a[q][p]='x';
  }
  else {//if(a[q][p]=='.'||a[q][p]=='r')注意边界!!!2啊!
   a[q][p]='#';
   dfs(q,p,t+1);
   a[q][p]='.';
  }
     }
 }
 return ;
}
int main(){
  freopen("1.txt","r",stdin);
 freopen("2.txt","w",stdout);
  while(cin>>m>>n){
   int i,j;l=0;minn=1000000;
   for(i=0;i<m;i++){
    for(j=0;j<n;j++){
     cin>>a[i][j];
     if(a[i][j]=='a')
     { sx=i;sy=j;}
     if(a[i][j]=='r')
     { ex=i;ey=j;}
    }
   }
   a[sx][sy]='#';
   dfs(sx,sy,0);
   if(l) cout<<minn<<endl;
   else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
  }

  fclose(stdout);

   fclose(stdin);
  return 0;
}