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

转载于:https://www.cnblogs.com/icode-girl/p/4592018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值