标签:
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1460 Accepted Submission(s): 435
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<vector> #include<stack> using namespace std; #define INF 100000000 int n,m,dist[20][20],dp[(1<<15)+5][20]; char s[20][20]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; bool vis[20][20]; struct node { int sx,sy,ex,ey; }e[20]; struct pos { int x,y,step; }; int bfs(node a,node b) { queue<pos> q; memset(vis,0,sizeof(vis)); pos fr,nt; fr.x=a.ex,fr.y=a.ey,fr.step=0; vis[fr.x][fr.y]=1; q.push(fr); while(!q.empty()) { fr=q.front(),q.pop(); if(fr.x==b.sx&&fr.y==b.sy) { return fr.step; } for(int i=0;i<4;i++) { nt.x=fr.x+dx[i]; nt.y=fr.y+dy[i]; if(nt.x<0||nt.y<0||nt.x>=n||nt.y>=n||vis[nt.x][nt.y]||s[nt.x][nt.y]==‘#‘) continue; vis[nt.x][nt.y]=1; nt.step=fr.step+1; q.push(nt); } } return -1; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { scanf("%s",s[i]); } for(int i=0;i<m;i++) { scanf("%d%d%d%d",&e[i].sx,&e[i].sy,&e[i].ex,&e[i].ey); e[i].sx--,e[i].sy--,e[i].ex--,e[i].ey--; } for(int i=0;i<m;i++) { for(int j=0;j<m;j++) { if(i==j) { dist[i][j]=0; continue; } dist[i][j]=bfs(e[i],e[j]); if(dist[i][j]==-1) dist[i][j]=INF; } } for(int i=0;i<(1<<m);i++) for(int j=0;j<m;j++) dp[i][j]=INF; for(int i=0;i<m;i++) dp[(1<<i)][i]=0; for(int s=0;s<(1<<m);s++) { for(int j=0;j<m;j++) { if(dp[s][j]==INF) continue; for(int k=0;k<m;k++) { if(s&(1<<k)) continue; if(dist[j][k]==INF) continue; dp[s|(1<<k)][k]=min(dp[s|(1<<k)][k],dp[s][j]+dist[j][k]); } } } int ans=INF; for(int i=0;i<m;i++) ans=min(ans,dp[(1<<m)-1][i]); if(ans>=INF) { printf("-1\n"); } else printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4397839.html