zoukankan      html  css  js  c++  java
  • bfs两种记录路径方法

    #include<cstdio>
    #include<queue>
    using namespace std;
    struct sss
    {
        int x,y;
    }ans[6][6];
    int map[6][6];
    int flag[6][6];
    int dec[4][2]={1,0,0,1,-1,0,0,-1};
    void print(struct sss q)
    {
        if(q.x==0&&q.y==0)
        {
            printf("(0, 0)
    ");
            return;
        }
        else
        {
            print(ans[q.x][q.y]);
            printf("(%d, %d)
    ",q.x,q.y);
        }
    }
    void bfs(int x,int y)
    {
        struct sss q;
        queue<struct sss> s;
        flag[0][0]=1;
        q.x=x;
        q.y=y;
        s.push(q);
        ans[0][0].x=-1;
        ans[0][0].y=-1;
        while(!s.empty())
        {
            q=s.front();
            s.pop();
            if(q.x==4&&q.y==4)
            {
                print(q);
                return;
            }
            for(int i=0;i<4;i++)
            {
                int xx=dec[i][0]+q.x;
                int yy=dec[i][1]+q.y;
                if(xx>=0&&xx<5&&yy>=0&&yy<5&&flag[xx][yy]==0&&map[xx][yy]==0)
                {
                    struct sss w;
                    w.x=xx;
                    w.y=yy;
                    s.push(w);
                    flag[xx][yy]=1;
                    ans[xx][yy].x=q.x;
                    ans[xx][yy].y=q.y;
                }
            }
        }
    }
    int main()
    {
        for(int i=0;i<5;i++)
        {
            for(int j=0;j<5;j++)
            {
                scanf("%d",&map[i][j]);
            }
        }
        bfs(0,0);
    }
    #include<cstdio>
    #include<cmath>
    #include<vector>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<map>
    #include<string>
    using namespace std;
    typedef long long ll;
    char mp[1001][1001];
    int n,m,k;
    int flag;
    int d[1001][1001];
    char jg[1000001];
    char yx[1000001];
    int dis[4][2]={1,0,0,-1,0,1,-1,0};
    char str[5]={"DLRU"};
    void pan(int x,int y){
        //printf("k=%d
    ",k);
        int tmp=k;
        for(int i=0;i<k;i++){
            int dex=-1;
            for(int j=0;j<4;j++){
                pair<int,int> z;
                z.first=x+dis[j][0];
                z.second=y+dis[j][1];
                if(z.first>=0&&z.first<n&&z.second>=0&&z.second<m&&mp[z.first][z.second]!='*'&&d[z.first][z.second]<tmp){
                    dex=j;
                    break;
                }
            }
            tmp--;
            x=x+dis[dex][0];
            y=y+dis[dex][1];
            jg[i]=str[dex];
        }
        jg[k]='';
        printf("%s
    ",jg);
    }
    void bfs(int x,int y)
    {
        queue<pair<int,int> > q;
        q.push(make_pair(x,y));
        for(int i=0;i<1000;i++){
            for(int j=0;j<1000;j++)
              d[i][j]=10000000;
        }
        int num=0;
        d[x][y]=0;
        while(!q.empty()){
            pair<int,int> w=q.front();
            q.pop();
            num++;
            for(int i=0;i<4;i++){
                pair<int,int> z;
                z.first=w.first+dis[i][0];
                z.second=w.second+dis[i][1];
                if(z.first>=0&&z.first<n&&z.second>=0&&z.second<m&&mp[z.first][z.second]=='.'){
                    if(d[z.first][z.second]>d[w.first][w.second]+1){
                        d[z.first][z.second]=d[w.first][w.second]+1;
                        q.push(z);
                    }
                }
            }
        }
        /*for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(d[i][j]==10000000) printf("%4d",-1);
                else printf("%4d",d[i][j]);
            }
            printf("
    ");
        }*/
    //    printf("num=%d
    ",num);
        if(num==1) printf("IMPOSSIBLE");
        else pan(x,y);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }
        if(k%2){
            printf("IMPOSSIBLE");
            return 0;
        }
        int vis=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++)
            {
                if(mp[i][j]=='X')
                {
                    mp[i][j]='.';
                    bfs(i,j);
                    vis=1;
                    break;    
                }        
            }
            if(vis) break;
        }
    }
  • 相关阅读:
    问题解决:System.TypeLoadException: 未能从程序集“XXX”中加载类型“XXX
    域名格式验证
    .NET 中String 和StringBuilder 以及他们的区别
    mysql 重设管理员密码 或忘记管理员密码 (必杀)
    CMD 命令
    C# 给多线程传参的三种方式
    django 表单数据的验证实现原理
    django上传文件
    django signal
    Django如何处理语言偏好(根据此可以设置中文)
  • 原文地址:https://www.cnblogs.com/Lis-/p/10572619.html
Copyright © 2011-2022 走看看