标签:
# 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