旅游
作者:互联网
题目:
这道题的思路是: 把景点之间的、起始点与景点之间的最短路径都求出来之后再做一遍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