其他分享
首页 > 其他分享> > 旅游

旅游

作者:互联网

题目:

 

 这道题的思路是: 把景点之间的、起始点与景点之间的最短路径都求出来之后再做一遍dfs  即可

程序:

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n,m,vis[N][N]={0},k;
string mp[N];
struct point{
    int x;
    int y;
};
queue <point> q;
point k1[100];
int d[10][10]={{1,0},{0,1},{-1,0},{0,-1}},dis[100][100]={0},a[100]={0},v[100]={0},ans=0X7FFFFFFF;
void dfs(int k2)
{
    if(k2>k)
    {
        int t=0;
        t+=dis[0][a[1]];
        for(int i=1;i<k;i++)
        {
            t+=dis[a[i]][a[i+1]];
        }
        ans=min(ans,t);
    }
    else
    {
        for(int i=1;i<=k;i++)
        {
            if(v[i]==0)
            {
                a[k2]=i;
                v[i]=1;
                dfs(k2+1);
                v[i]=0;
            }
        }
    }
}
void bfs(point s)
{
    q.push(s);
    while(q.size())
    {
        point op=q.front();
        if(mp[op.x][op.y]>='1'&&mp[op.x][op.y]<='9')
        {
            if(s.x==0&&s.y==0) dis[0][mp[op.x][op.y]-'0']=vis[op.x][op.y];
            else dis[mp[s.x][s.y]-'0'][mp[op.x][op.y]-'0']=vis[op.x][op.y];
        }
        for(int i=0;i<4;i++)
        {
            point np;
            np.x=op.x+d[i][0];
            np.y=op.y+d[i][1];
            if(np.x>=0&&np.x<n&&np.y>=0&&np.y<m&&vis[np.x][np.y]==0&&mp[np.x][np.y]!='#')
            {
                vis[np.x][np.y]=vis[op.x][op.y]+1;
                q.push(np);
            }
        }
        q.pop();
    }
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
    {
        cin>>mp[i];
        for(int j=0;j<m;j++)
        {
            if(mp[i][j]>='1'&&mp[i][j]<='9')
            {
                k1[mp[i][j]-'0'].x=i;
                k1[mp[i][j]-'0'].y=j;
            }
        }
    }
    k1[0].x=0;
    k1[0].y=0;
    for(int i=0;i<=k;i++)
    {
        memset(vis,0,sizeof(vis));
        vis[k1[i].x][k1[i].y]=1;
        bfs(k1[i]);
    }
    dfs(1);
    cout<<ans-k;
    return 0;
}

 

标签:point,int,dfs,旅游,&&,100,mp
来源: https://www.cnblogs.com/wjk53233/p/16095593.html