标签:
# include<iostream> # include<cstdio> # include<queue> # include<cstring> # include<algorithm> using namespace std; const int INF=100000; struct TT { int sx,sy,ex,ey; }; struct node { int x,y,t; node(int _x,int _y,int _t):x(_x),y(_y),t(_t){} }; TT t[15]; char mp[20][20]; int dist[20][20]; int vis[20][20],n,m,dp[1<<15][15]; int d[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int bfs(int sx,int sy,int ex,int ey) { queue<node>q; memset(vis,0,sizeof(vis)); vis[sx][sy]=1; q.push(node(sx,sy,0)); while(!q.empty()) { node u=q.front(); q.pop(); if(u.x==ex&&u.y==ey) return u.t; for(int i=0;i<4;++i){ int nx=u.x+d[i][0],ny=u.y+d[i][1]; if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&!vis[nx][ny]&&mp[nx][ny]!=‘#‘){ vis[nx][ny]=1; q.push(node(nx,ny,u.t+1)); } } } return INF; } void init() { for(int i=0;i<m;++i) for(int j=0;j<m;++j) dist[i][j]=bfs(t[i].ex,t[i].ey,t[j].sx,t[j].sy); } void DP() { int tot=1<<m; for(int i=0;i<tot;++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 i=1;i<tot;++i){ for(int j=0;j<m;++j){ if(i&(1<<j)) continue; int sta=i|(1<<j); for(int k=0;k<m;++k){ if(i&(1<<k)) dp[sta][j]=min(dp[sta][j],dp[i][k]+dist[k][j]); } } } int ans=INF; for(int i=0;i<m;++i) ans=min(ans,dp[tot-1][i]); if(ans==INF) printf("-1\n"); else printf("%d\n",ans); } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;++i) scanf("%s",mp[i]+1); for(int i=0;i<m;++i) scanf("%d%d%d%d",&t[i].sx,&t[i].sy,&t[i].ex,&t[i].ey); init(); DP(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/20143605--pcx/p/4786933.html