• 伪DFS...BFS+模拟--poj3083


    题目描述

    额,这个标题有点不友好,主要是被恶心了两天了,本来很快就写出来,结果超内存,怎么优化都不行,刚才才发现!原因是找最短路时用bfs,没有加visit数组...导致他虽然能出结果,但是搜索了无数次。。。

    这道题主要在于方向处理,真正思考过并不难,定义move数组时,按移动方向顺时针定义,然后,对于当前方向,比如“上”,如果这时候我们是向左手边走,那么我们就从move向“左”开始遍历move,只要遍历到合法的move,就把for break掉。

    另外说一点,这道题其实不需要dfs,dfs是用来搜索的,是一种搜索的策略,搜索什么呢?目标,路径,都可以,,搜索的是我们原本不知道具体位置的东西,而这道题中,“沿左手边走”“沿右手边走”这都是确定的东西,所以根本不需要dfs,一个while(没有找到目标位置),里面套一个遍历move数组的for,这就够了,这样子的代码也简单

    至于bfs,找最短路,这个就无需解释了

    代码0ms,284kb,还算ok,也不长  感谢马榕仙女姐姐的指点~

    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    
    #define move movee
    
    int l,h,bx,by,ex,ey;
    char map[41][41];
    int ans,num;
    int vis[41][41];
    int move[][2]={{0,-1},{-1,0},{0,1},{1,0}}; //左上右下 
    
    struct tt{
        int x;
        int y;
        int steps;
        tt(int x,int y,int steps):x(x),y(y),steps(steps){}
        tt(){}
    }ttt;
    queue<tt> q;
    
    int check(int x,int y){
        return x>0 && x<=h && y>0 && y<=l;
    }
    
    void dfsl(int x,int y,int i){
    
        int cnt=1;
        int tx,ty;
        while(!(x==ex && y==ey)){
            int cnt=1;
            i=(i+3)%4;
            for(;(cnt++)<=4;i=(i+1)%4){
                tx=x+move[i][0];
                ty=y+move[i][1];
                if(!check(tx,ty) || map[tx][ty]=='#') continue;
                num++;
                x=tx;
                y=ty;
    //            cout<<123456789;
                break;
                
            }
        }
            ans=num;
            cout<<ans<<' ';
    }
    
    void dfsr(int x,int y,int i){
    
        int cnt=1;
        int tx,ty;
        while(!(x==ex && y==ey)){
            int cnt=1;
            i=(i+1)%4;
            for(;(cnt++)<=4;i=(i+3)%4){
                tx=x+move[i][0];
                ty=y+move[i][1];
                if(!check(tx,ty) || map[tx][ty]=='#') continue;
                num++;
                x=tx;
                y=ty;
                break;
            }
        }
            ans=num;
            cout<<ans<<' ';
    }
    
    void bfs(){
        tt temp;
        int tx,ty;
        while(!q.empty()){
            temp=q.front();
            q.pop();
            if(temp.x==ex && temp.y==ey){
                cout<<temp.steps+1;
                goto L;
            }
            for(int i=0;i<4;i++){
                tx=temp.x+move[i][0];
                ty=temp.y+move[i][1];
                if(!check(tx,ty) || map[tx][ty]=='#' || vis[tx][ty]) continue;
                vis[tx][ty]=1;
                q.push(tt(tx,ty,temp.steps+1) );
            }
        }
    L:  return; 
    }
    
    
    int main(){
    
        int t;
        cin>>t;
        while(t--){
            while(!q.empty()) q.pop();
            ans=num=1;
            cin>>l>>h;
            for(int i=1;i<=h;i++){
                for(int j=1;j<=l;j++){
                    cin>>map[i][j];
                    if(map[i][j]=='S'){
                        bx=i;by=j;
                    } 
                    if(map[i][j]=='E'){
                        ex=i;ey=j;
                    }
                } 
            } 
            int tx,ty;
            for(int i=0;i<4;i++){
                tx=bx+move[i][0];
                ty=by+move[i][1];
                if(!check(tx,ty)) continue;
                
                if(map[tx][ty]=='.'){
                    dfsl(bx,by,i);
                    
                    ans=num=1;
                    dfsr(bx,by,i);
                    
                    ans=num=1;
                    ttt.x=bx;
                    ttt.y=by;
                    ttt.steps=0;
                    q.push(ttt);
                    memset(vis,0,sizeof(vis));
                    vis[bx][by]=1;
                    bfs(); 
                    break;
                }
                
            }
            cout<<endl;
        }
        return 0;
    }
    柳暗花明又一村
  • 相关阅读:
    在Android模拟器(BlueStacks)中调试录音应用【20121221】
    一路来的脚印_停第二念【20130109】
    Office集锦_Word_禁止在粘帖内容前后添加空格【201318】
    Libgdx使用过程中在Android环境下遇到的各种错误提示的解决【2012112】
    童真趣语【20121217】
    【转】Android中的资源分析、读取【2012113】
    Office集锦_Word_禁止拼写检查【201318】
    BlueStacks中用户自己的SdCard的位置【2012116】
    Eclipse+BlueStacks调试Android应用_补充篇【20121030】
    The Power of H3D2 ! 截图,视频!
  • 原文地址:https://www.cnblogs.com/ucandoit/p/8670176.html
Copyright © 2020-2023  润新知