zoukankan      html  css  js  c++  java
  • poj 3083 Children of the Candy Corn(DFS+BFS)

    做了1天,总是各种错误,很无语

    最后还是参考大神的方法

    题目:http://poj.org/problem?id=3083

    题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径

    DFS找左右侧 的最短路径

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<stack>
      6 #include<queue>
      7 #include<cmath>
      8 #include<algorithm>
      9 using namespace std;
     10 char G[50][50];
     11 int vis[50][50];
     12 int c,r;
     13 struct node
     14 {
     15     int x,y,dis;
     16 }s,pos,next;
     17 
     18 int dx[5]= {0,-1,0,1};
     19 int dy[5]= {-1,0,1,0};
     20 int dfs(int x,int y,int f,char ch)//这题dfs是重点,f表示当前的朝向
     21 {
     22     int i,j,nx,ny,nf;
     23     if(G[x][y]=='E')
     24         return 1;
     25     if(ch=='l')
     26     {
     27         for(i=f-1; i<f+3; i++)
     28         {
     29             nx=x+dx[(i+4)%4];
     30             ny=y+dy[(i+4)%4];
     31             nf=(i+4)%4;
     32             if(nx>=0&&nx<r&&ny>=0&&ny<c&&G[nx][ny]!='#')
     33                 return dfs(nx,ny,nf,ch)+1;
     34         }
     35     }
     36     else if(ch=='r')
     37     {
     38         for(i=f+1; i>f-3; i--)
     39         {
     40             nx=x+dx[(i+4)%4];
     41             ny=y+dy[(i+4)%4];
     42             nf=(i+4)%4;
     43             if(nx>=0&&nx<r&&ny>=0&&ny<c&&G[nx][ny]!='#')
     44                 return dfs(nx,ny,nf,ch)+1;
     45         }
     46     }
     47     return 0;
     48 }
     49 
     50 int bfs(int x,int y)
     51 {
     52     queue<node>q;
     53     int i;
     54     memset(vis,0,sizeof(vis));
     55     next.dis=1; next.x=x; next.y=y;
     56     vis[x][y]=1;
     57     q.push(next);
     58     while(!q.empty())
     59     {
     60        pos=q.front();
     61        q.pop();
     62        for(i=0; i<4; i++)
     63        {
     64            next.x=pos.x+dx[i]; next.y=pos.y+dy[i];
     65            next.dis=pos.dis+1;
     66            if(next.x>=0&&next.x<r&&next.y>=0&&next.y<c&&G[next.x][next.y]!='#'&&vis[next.x][next.y]==0)
     67            {
     68                q.push(next);
     69                vis[next.x][next.y]=1;
     70                 if(G[next.x][next.y]=='E')
     71                 return next.dis;
     72            }
     73        }
     74     }
     75     return 0;
     76 }
     77 int main()
     78 {
     79     int i,j,t;
     80     int le,ri,f,ans,flag;
     81     cin>>t;
     82     while(t--)
     83     {
     84         cin>>c>>r;
     85         for(i=0; i<r; i++)
     86             cin>>G[i];
     87         flag=0;
     88         for(i=0; i<r; i++)
     89         {
     90             for(j=0; j<c; j++)
     91                 if(G[i][j]=='S')
     92                 {
     93                     s.x=i;
     94                     s.y=j;
     95                     s.dis=1;
     96                     if(i==0)
     97                         f=3;
     98                     else if(i==r-1)
     99                         f=1;
    100                     else if(j==0)
    101                         f=2;
    102                     else if(j==c-1)
    103                         f=0;
    104                     flag=1;
    105                     break;
    106                 }
    107             if(flag)
    108                 break;
    109         }
    110         le=dfs(s.x,s.y,f,'l');
    111         ri=dfs(s.x,s.y,f,'r');
    112         ans=bfs(s.x,s.y);
    113         printf("%d %d %d
    ",le,ri,ans);
    114     }
    115     return 0;
    116 }
  • 相关阅读:
    android gradle 多渠道打包
    Gradle Plugin User Guide 中文版
    最好的JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
    ANDROID 中UID与PID的作用与区别
    HTTP Header 详解
    HTTP协议详解
    Volatile总结
    Condition-线程通信更高效的方式
    JAVA基础知识点(转载的)
    CountDownLatch和CyclicBarrier的区别
  • 原文地址:https://www.cnblogs.com/bfshm/p/3241835.html
Copyright © 2011-2022 走看看