程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDOJ/HDU 1728 逃離迷宮 DFS 深度優先搜素

HDOJ/HDU 1728 逃離迷宮 DFS 深度優先搜素

編輯:C++入門知識

深搜思路:記錄4個方向和拐彎次數,若拐彎3次,則必須是當前點和終點在一條直線才滿足要求,否則剪掉,這樣也超時,坑爹,之前連連看那個題就是用這種方法也能過,不知道這次為啥過不了,下次再優化。

代碼:


[cpp]
#include <iostream>  
#include <cmath>  
#include <string>  
#include <algorithm>  
#include <vector>  
#include <fstream>  
using namespace std; 
int m,n,k,sx,sy,endx,endy; 
int dir[4][2]={-1,0,1,0,0,1,0,-1}; 
char maze[101][101]; 
bool visit[101][101]; 
bool flag; 
void dfs(int x,int y,int dir,int turn){ 
     
//  cout<<"x: "<<x<<" y: "<<y<<endl;  
     
    if( x<=0||x>m||y<=0||y>n || maze[x][y]=='*')return ; 
     
    if(x==endx&&y==endy&&turn<=k){ 
        flag=1; 
        return ; 
    } 
    if(flag)return ; 
    if(turn>k)return ;  
     
    if(turn==k) //剪枝,此時拐彎已經k次,若沒在一條直線上則剪掉   
    { 
        if(!(dir==1&&x>endx&&y==endy || dir==2&&x<endx&&y==endy || dir==3&&x==endx&&y>endy || dir==4&&x==endx&&y<endy)) 
            return ; 
    } 
     
     
    if(visit[x][y])return ; 
     
     
    visit[x][y]=1; 
    if(dir==1){      //往上走,用dir==1表示,此時三種情況,1:繼續往上走,不拐  
                    //2:往右走,拐一次,3:往左走,拐一次。以下類似。  
        dfs(x-1,y,1,turn);   
        dfs(x,y-1,3,turn+1);   
        dfs(x,y+1,4,turn+1);   
    } 
    else if(dir==2){   
        dfs(x+1,y,2,turn);   
        dfs(x,y-1,3,turn+1);   
        dfs(x,y+1,4,turn+1);   
    }   
    else if(dir==3){   
        dfs(x-1,y,1,turn+1);   
        dfs(x+1,y,2,turn+1);   
        dfs(x,y-1,3,turn);   
    }   
    else if(dir==4){   
        dfs(x-1,y,1,turn+1);   
        dfs(x+1,y,2,turn+1);   
        dfs(x,y+1,4,turn);   
    }   
    visit[x][y]=0;  

int main() 

    int t; 
//  ifstream fin;  
    //fin.open("abc.txt");  
    //cout<<fin.is_open()<<endl;  
    scanf("%d",&t); 
//  cin>>t;  
    while(t--) 
    { 
        cin>>m>>n; 
        for(int i=1;i<=m;i++){ 
            for(int j=1;j<=n;j++){ 
                cin>>maze[i][j]; 
            } 
        }    
        scanf("%d %d %d %d %d",&k,&sy,&sx,&endy,&endx); 
        if(sx==endx&&sy==endy){ 
            cout<<"yes"<<endl; 
            continue; 
        } 
        memset(visit,0,sizeof(visit)); 
        flag=0; 
        visit[sx][sy]=1; 
         
        dfs(sx-1,sy,1,0); //go up,dir==1  
        dfs(sx+1,sy,2,0); //go down ,dir==2  
        dfs(sx,sy-1,3,0); //go left,dir==3  
        dfs(sx,sy+1,4,0); //go right,dir==4  
         
        if(flag)cout<<"yes"<<endl; 
        else cout<<"no"<<endl;       
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved