1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<queue>
5 using namespace std;
6 int xx[]={0,0,1,-1};
7 int yy[]={-1,1,0,0};
8 int vis[16][16],dis[16][16],sx[16],sy[16],ex[16],ey[16],n,m;
9 int dp[100005][16];
10 char mapp[16][16];
11 struct dian
12 {
13 int x,y,step;
14 };
15 void bfs(int from,int to,int px,int py,int qx,int qy)
16 {
17 memset(vis,0,sizeof(vis));
18 queue<dian>q;
19 dian n1,n2;
20 n1.x=px; n1.y=py; n1.step=0; vis[px][py]=1;
21 while (!q.empty()) q.pop();
22 q.push(n1);
23 while (!q.empty())
24 {
25 n1=q.front(); q.pop();
26 if (n1.x==qx&&n1.y==qy) {dis[from][to]=n1.step; return; }
27 for (int i=0;i<4;i++)
28 {
29 n2.x=n1.x+xx[i];
30 n2.y=n1.y+yy[i];
31 n2.step=n1.step+1;
32 if (n2.x<0||n2.x>=n||n2.y<0||n2.y>=n||vis[n2.x][n2.y]||mapp[n2.x][n2.y]=='#') continue;
33 vis[n2.x][n2.y]=1;
34 q.push(n2);
35 }
36 }
37 dis[from][to]=100000;
38 return;
39 }
40 int main()
41 {
42 int i,j,k,min,sta;
43 while (~scanf("%d%d",&n,&m))
44 {
45 for (i=0;i<n;i++){getchar(); scanf("%s",mapp[i]); }
46 for (i=0;i<m;i++) {
47 scanf("%d%d%d%d",&sx[i],&sy[i],&ex[i],&ey[i]);
48 sx[i]--; sy[i]--; ex[i]--; ey[i]--;
49 }
50 for (i=0;i<m;i++)
51 for (j=0;j<m;j++)
52 bfs(i,j,ex[i],ey[i],sx[j],sy[j]);
53 for (i=1;i<(1<<m);i++)
54 for (j=0;j<m;j++)
55 if ((i&(1<<j))!=0)
56 {
57 sta=i^(1<<j);
58 min=0x3f3f3f3f;
59 for (k=0;k<m;k++)
60 if (((sta&(1<<k))!=0)&&(dp[sta][k]+dis[k][j]<min)) min=dp[sta][k]+dis[k][j];
61 if (min==0x3f3f3f3f) dp[i][j]=0;
62 else dp[i][j]=min;
63 }
64 min=0x3f3f3f3f;
65 for (i=0;i<m;i++)
66 if (dp[(1<<m)-1][i]<min) min=dp[(1<<m)-1][i];
67 if (min>10000) printf("-1\n");
68 else printf("%d\n",min);
69 }
70 }
http://acm.hdu.edu.cn/showproblem.php?pid=4856