美文网首页
寻找最后之作-bfs

寻找最后之作-bfs

作者: httpsbao | 来源:发表于2019-03-29 19:21 被阅读0次

    题目传送:寻找最后之作

    题目描述:
    总计230万人,其中学生占80%的学园都市,所有学生必须接受超能力开发。在领土方面,分为23个学区,每个学区有其不同职能。学园都市并无常备武装力量,甚至不存在警察。取而代之的是从学生中挑选出的风纪委员(Judgement)和教师自愿参与的警备员(Anti-Skill)维护治安,甚至可以组织成对外打击军队。其科技高度发达,领先于外域大约20至30年,高度的科学技术不仅使其合作组织遍布世界各地,为了防止外部势力渗透、科学技术流失、学园都市对人口出入进行严格的管制。
    在学园都市内,众所周知,有一位白发苍苍,行动不便的老人,由于他只能拄着拐杖慢慢行走,连回头都十分不方便,所以大家都叫他“一方通行”,不过好在一直有一个可爱的小女孩——最后之作(Last Order)陪在他身边,他的晚年生活不再寂寞,而是充满了色彩。
    但是有一天,在他们出门散步的时候,“我的肚子饿了,想吃冰淇淋啦!御坂御坂摸着自己的肚子,渴望地盯着你说道”,小女孩就跑掉了,老人非常着急,你能帮他找到正确的道路,尽快追上最后之作吗?

    输入描述:
    第一行是一个正整数T,代表输入数据的组数。每组数据的第一行有两个正整数,m,n。m为地图的长度,n为地图的宽度(m,n<=100)。接下来的m行中,每行为一个长度为n的字符串,“.”表示可以通行,“#”表示不可以通行,“A”为一方通行所在地,“L”为最后之作所在地。每一步可以有八个方向(上、下、左、右、左上、左下、右上、右下)。

    输出描述:
    对于每组输入数据,如果最后可以找到最后之作,输出一个整数,为消耗的最小步数,如果无法到达,输出“I Need Move Point”(有空格,没有引号)。

    示例1
    输入
    2
    3 3
    A##
    ..#
    #.L
    1 4
    A.#L

    输出
    2
    I Need Move Point

    bfs

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1000+5;
    int t,m,n;
    char a[maxn][maxn];
    int book[maxn][maxn];
    int nxt[8][2]={{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{-1,1},{1,-1},{1,1}};
    struct note{
        int x;
        int y;
        int s;
    };
    note q[maxn*maxn];
    int main(){
        cin>>t;
        int stx,sty;
        for(int k=0;k<t;k++){
            int tx,ty;
            cin>>m>>n;
            for(int i=0;i<m;i++){
                for(int j=0;j<n;j++){
                    cin>>a[i][j];
                    if(a[i][j]=='A')
                        stx=i,sty=j;               
                }
                getchar();//吸收回车
            }
            memset(book,0,sizeof book);
            int head=1,tail=1;
            q[tail].x=stx;
            q[tail].y=sty;
            q[tail].s=0;
            tail++;
            book[stx][sty]=1;
            int flag=0;
            while(head<tail){
                for(int i=0;i<8;i++){
                    tx=q[head].x+nxt[i][0];
                    ty=q[head].y+nxt[i][1];
                    if(tx>=0&&tx<m&&ty>=0&&ty<n&&book[tx][ty]==0&&(a[tx][ty]=='.'||a[tx][ty]=='L')){
                        book[tx][ty] = 1;
                        q[tail].x = tx;
                        q[tail].y = ty;
                        q[tail].s = q[head].s+1;
                        tail++;
                    }
                    if(a[tx][ty]=='L'){
                        flag=1;
                        break;
                    }
                }
                if(flag==1)break;
                head++;
            }
            if(flag==1)
                cout<<q[tail-1].s<<endl;
            else cout<<"I Need Move Point"<<endl;
        }
        return 0;
    }
    

    STL实现

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e2+10;
    char e[maxn][maxn];
    int book[maxn][maxn];
    int flag,ans;
    int m,n;
    int nxt[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    struct point{
        int x,y,s;
        point(int xx,int yy,int ss){//构造函数定义
            x=xx;
            y=yy;
            s=ss;
        }
    };
    queue<point>q;
    void bfs(int sx,int sy){
        memset(book,0,sizeof(book));
        q=queue<point>();//实例化
        q.push(point(sx,sy,0));
        book[sx][sy]=1;
        while(!q.empty()){
            point u=q.front();
            for(int i=0;i<8;i++){
                //point v;//切记初始化
                point v=point(0,0,0);
                v.x=u.x+nxt[i][0];
                v.y=u.y+nxt[i][1];
                v.s=u.s+1;
                if(v.x>=1&&v.x<=m&&v.y>=1&&v.y<=n&&e[v.x][v.y]!='#'&&book[v.x][v.y]==0){
                    q.push(v);
                    book[v.x][v.y]=1;
                    if(e[v.x][v.y]=='L'){
                        flag=1;
                        ans=v.s;
                        break;
                    }
                }            
            }
            if(flag==1)break;
            q.pop();
        }
    }
    int main(){
        int t;
        int sx,sy;
        cin>>t;
        for(int k=1;k<=t;k++){
            flag=0;
            cin>>m>>n;
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    cin>>e[i][j];
                    if(e[i][j]=='A'){
                        sx=i;
                        sy=j;
                    }                    
                }
                getchar();//切记char型的回车问题
            }
            bfs(sx,sy);
            if(flag==1)cout<<ans<<endl;
            else cout<<"I Need Move Point"<<endl;
        }
        return 0;
    }
    

    无构造函数写法:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=110;
    struct node{//记录点的坐标和走的步数
        int x;
        int y;
        int step;
    }s;
    int m,n;
    char a[maxn][maxn];
    const int nxt[8][2]={{1,0},{0,-1},{-1,0},{0,1},{-1,1},{-1,-1},{1,1},{1,-1}};
    int book[maxn][maxn],sx,sy,ex,ey;//book用来标记这个点是否走过
    int bfs(int xx, int yy){
        queue<node>p;
        s.x=xx;
        s.y=yy;
        s.step=0;
        p.push(s);
        while(!p.empty()){//队列为空表示遍历完了
            int nx,ny,nstep;
            nx=p.front().x;
            ny=p.front().y;
            nstep=p.front().step;
            if(nx==ex&&ny==ey)return nstep;//如果到达终点就返回步数退出函数
            p.pop();
            for (int i=0;i<8;i++){
                int tx,ty,tstep;
                tx=nx+nxt[i][0];
                ty=ny+nxt[i][1];
                if(tx<0||ty<0||tx>=m||ty>=n||book[tx][ty]==1||a[tx][ty]=='#') continue;
                book[tx][ty]=1;
                tstep=nstep+1;
                s.x=tx;
                s.y=ty;
                s.step=tstep;
                p.push(s);//把符合条件的点入队
            }
        }
        return -1;//遍历完了还没有退出表示走不到终点,返回-1表示走不到
    }
    int main(){
        int T;
        cin>>T;
        for(int k= 0;k<T;k++){
            cin >> m >> n;        
            for (int i= 0; i<m; i++){
                for (int j=0;j<n;j++){
                    cin>>a[i][j];
                    if(a[i][j]=='A'){
                        sx=i;
                        sy=j;
                    }
                    if(a[i][j]=='L'){
                        ex= i;
                        ey =j;
                    }
                }
                getchar();
            }
            memset(book,0,sizeof(book));
            int ans;
            ans=bfs(sx,sy);
            if(ans >= 0)
                printf("%d\n",ans);
            if(ans==-1)
                printf("I Need Move Point\n");
        }
        return 0;
    }
    

    dfs超时

    //dfs超时
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100+5;
    int book[maxn][maxn];
    char a[maxn][maxn];
    int m,n,t,ans;
    int stx,sty;
    int nxt[8][2]={{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{-1,1},{1,-1},{1,1}};
    void dfs(int tx,int ty,int step){ 
        if(a[tx][ty]=='L'){
            ans=min(ans,step);
        }    
        int x,y;
        for(int i=0;i<8;i++){
            x=tx+nxt[i][0];
            y=ty+nxt[i][1];
            if(x>=0&&x<m&&y>=0&&y<n&&book[x][y]==0&&(a[x][y]=='.'||a[x][y]=='L')){
                book[x][y]=1;
                dfs(x,y,step+1);
                book[x][y]=0;
            }        
        }
    }
    int main(){
        cin>>t;
        for(int k=1;k<=t;k++){
            cin>>m>>n;
            ans=1e9;
            for(int i=0;i<m;i++){
                for(int j=0;j<n;j++){
                    cin>>a[i][j];
                    if(a[i][j]=='A'){
                        stx=i;
                        sty=j;
                    }
                } 
            }
            book[stx][sty]=1;
            dfs(stx,sty,0);
            book[stx][sty]=0;
            if(ans==1e9)   cout<<"I Need Move Point"<<endl;
            else cout<<ans<<endl;
        }                 
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:寻找最后之作-bfs

          本文链接:https://www.haomeiwen.com/subject/mnjrbqtx.html