POJ 3083 Children of the Candy Corn (BFS+顺时针逆时针DFS)

题目:http://poj.org/problem?id=3083   搜索好题。学会了一种控制搜索方向的方法。   求S到E的最短距离很简单,直接BFS就可以了。关键就是处理怎么样保证沿左墙壁走和沿右墙壁走。 会用了顺时针、逆时针dfs这个神奇又好用的东西,很方便~~~ 自己也不会总结了。。。。。。就在代码中标出来吧。。。。。。  
#include 
 
   
    
  
#include 
  
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                 #include 
                 
                   #include 
                  
                    #include 
                   
                     using namespace std; int w,h; char s[40][40]; int sx,sy,ex,ey; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int num[40][40]; void bfs() { int vis[40][40]; memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); queue < pair 
                    
                      > Q; while(!Q.empty()) Q.pop(); num[sx][sy]=1; Q.push(make_pair(sx,sy)); vis[sx][sy]=1; while(!Q.empty()) { int kx=Q.front().first; int ky=Q.front().second; Q.pop(); if (kx==ex && ky==ey) break; for (int i=0;i<4;i++) { int px=kx+dx[i]; int py=ky+dy[i]; if (s[px][py]!='#' && !vis[px][py]) { Q.push(make_pair(px,py)); num[px][py]=num[kx][ky]+1; vis[px][py]=1; } } } return ; } int dfs_anticlockwise(int x,int y,int d) //逆时针dfs,即左优先,d要与实际反向,具体结合下面那行代码理解下。。。。。。 { if (x==ex && y==ey) return 1; int px,py,temp; for (int i=1;i<=4;i++) { temp=(d+i)%4;          //决定逆时针方向的核心代码 px=x+dx[temp]; py=y+dy[temp]; if (px>=0 && px 
                     
                       =0 && py 
                      
                        =0 && px 
                       
                         =0 && py 
                        
                          >n; while(n--) { cin>>w>>h; for (int i=0;i 
                         
                           >s[i][j]; if (s[i][j]=='S') { sx=i; sy=j; } if (s[i][j]=='E') { ex=i; ey=j; } } int d=0; bfs(); int ans1=dfs_anticlockwise(sx,sy,d); int ans2=dfs_clockwise(sx,sy,d); cout< 
                          
                              
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                
               
              
             
            
           
          
         
        
       
      
    
 
   

你可能感兴趣的:(children)