zoukankan      html  css  js  c++  java
  • hdu 4771 Stealing Harry Potter's Precious

    题目:给出一个二维图,以及一个起点,m个中间点,求出从起点出发,到达每一个中间的最小步数。

    思路:由于图的大小最大是100*100,所以要使用bfs求出当中每两个点之间的最小距离。然后依据这些步数,建立一个新的图,使用dfs求出最佳步数。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #define INF 100000000
    using namespace std;
    char ma[103][103];
    int vis[103][103];
    int map[6][6],net[6];
    int m,n,k;
    struct node
    {
        int x,y;
        int k;
    }t;
    queue<node>q;
    int bfs(int x,int y,int l,int r)
    {
        memset(vis,0,sizeof(vis));
        while(!q.empty())
        {
            q.pop();
        }
        vis[x][y]=1;
        t.x=x,t.y=y,t.k=0;
        q.push(t);
        while(!q.empty())
        {
            t=q.front();
            q.pop();
            x=t.x;y=t.y;
            if(x==l&&y==r)
            {
                return t.k;
            }
            t.k++;
            if(x>=2&&ma[x-1][y]!='#'&&!vis[x-1][y])
            {
                t.x=x-1;t.y=y;
                vis[t.x][t.y]=1;
                q.push(t);
            }
            if(y>=2&&ma[x][y-1]!='#'&&!vis[x][y-1])
            {
                t.x=x;t.y=y-1;
                vis[t.x][t.y]=1;
                q.push(t);
            }
            if(x+1<=m&&ma[x+1][y]!='#'&&!vis[x+1][y])
            {
                t.x=x+1;t.y=y;
                vis[t.x][t.y]=1;
                q.push(t);
            }
            if(y+1<=n&&ma[x][y+1]!='#'&&!vis[x][y+1])
            {
                t.x=x;t.y=y+1;
                vis[t.x][t.y]=1;
                q.push(t);
            }
        }
        return INF;
    }
    int ans=INF;
    void dfs(int x,int step,int sum)
    {
        if(step==k)
        {
            if(ans>sum) ans=sum;
            return;
        }
        for(int i=0;i<=k;i++)
        if(!net[i])
        {
           net[i]=1;
           dfs(i,step+1,sum+map[x][i]);
           net[i]=0;
        }
    }
    int main()
    {
        int d[6][2];
        while(cin>>m>>n,m,n)
        {
            int x=0,y=0,l,r,sum;
            ans=INF;
            for(int i=1;i<=m;i++)
            {
                scanf("%s",&ma[i][1]);
                if(!x)
                    for(int j=1;j<=n;j++)
                    if(ma[i][j]=='@')
                    {
                      x=i,y=j;
                      break;
                    }
            }
            d[0][0]=x;d[0][1]=y;
            cin>>k;
            for(int i=1;i<=k;i++)
            {
                cin>>d[i][0]>>d[i][1];
            }
            for(int i=0;i<k;i++)
            {
                x=d[i][0],y=d[i][1];
                for(int j=i+1;j<=k;j++)
                {
                    l=d[j][0],r=d[j][1];
                    sum=bfs(x,y,l,r);
                    if(sum<INF) map[i][j]=map[j][i]=sum;
                    else map[i][j]=map[j][i]=INF;
                    //cout<<sum<<endl;
                }
            }
            net[0]=1;
            dfs(0,0,0);
            if(ans<INF) cout<<ans<<endl;
            else cout<<-1<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    jar包启动的日志管理问题
    docker常用命令-----镜像与容器
    Maven+Nexus私服的搭建
    公允价值变动损益期末处理
    递延所得税资产怎么算
    固定资产转投资性房地产的差额为什么计入其他综合收益
    固定资产转投资性房地产
    固定资产折旧方法
    SublimeText注册码(亲测可用)
    未分配利润和净利润的区别是什么?
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4549355.html
Copyright © 2011-2022 走看看