POJ 3083 Bfs+Dfs

注意求最短路的时候用Bfs。

#include<iostream>
#include<stdio.h> using namespace std; int w,h,ex,ey,sx,sy; int map[100][100],can[100][100]; struct vid{  int x,y,step; }queue[5000]; int zan[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int dirl[4][2]={0,-1,-1,0,0,1,1,0},dirr[4][2]={0,1,1,0,0,-1,-1,0}; int dfsr(int dstep,int x,int y,int di ) {  int i,temp1,temp2;    for(i=0;i<4;i++)  {    temp1=x+dirr[i][0];    temp2=y+dirr[i][1];          if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w))   {    if(dfsr(dstep+1,x+dirr[i][0],y+dirr[i][1],i))     return dstep;    else     return 0;   }  }  return 0; } int dfsl(int dstep,int x,int y,int di ) {   int i,temp1,temp2;   for(i=0;i<4;i++)  {    temp1=x+dirl[i][0];    temp2=y+dirl[i][1];          if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w))   {    if(dfsl(dstep+1,temp1,temp2,i))     return dstep;    else     return 0;   }  }  return 0; } int bfs() { if (sx == ex && sy == ey) { return 1; }  int t,ww,x,y,t1,t2;  t=ww=1;  queue[t].x=sx;  queue[t].y=sy;  queue[t].step=0;  can[sx][sy]=1;  while(t<=ww&&!can[ex][ey])  {    x=queue[t].x; y=queue[t].y; for(int i=0;i<4;i++) if((!map[x+zan[i][0]][y+zan[i][1]])&&(!can[x+zan[i][0]][y+zan[i][1]])) { t1=x+zan[i][0]; t2=y+zan[i][1]; if(t1>=0&&(t1<h)&&(t2>=0)&&(t2<w)&&(!map[t1][t2])&&(!can[t1][t2])) { queue[++ww].x=t1; queue[ww].y=t2; queue[ww].step=queue[t].step+1; can[t1][t2]=1; } } t++; } return queue[ww].step+1; } int main () { int t; char c; scanf("%d",&t); getchar(); while(t--) { scanf("%d%d",&w,&h); getchar(); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { can[i][j]=0; c=getchar(); if(c=='#') map[i][j]=1; else if(c=='.') map[i][j]=0; else if(c=='S') { map[i][j]=0; sx=i,sy=j; } else if(c=='E') { map[i][j]=0; ex=i;ey=j; } } getchar(); } // init(); // dfsr(); // printf("%d ",bfs()); printf("%d %d %d\n",dfsl(0,sx,sy,0)+1,dfsr(0,sx,sy,0)+1,bfs()); } return 0; }

你可能感兴趣的:(poj)