Tunnels
64-bit integer IO format: %I64d Java class name: Main
Input
For each testcase, the first line contains two integers N (1 ≤ N ≤ 15), the side length of the square map and M (1 ≤ M ≤ 15), the number of tunnels.
The map of the city is given in the next N lines. Each line contains exactly N characters. Barrier is represented by “#” and empty grid is represented by “.”.
Then M lines follow. Each line consists of four integers x1, y1, x2, y2, indicating there is a tunnel with entrence in (x1, y1) and exit in (x2, y2). It’s guaranteed that (x1, y1) and (x2, y2) in the map are both empty grid.
Output
If it is impossible for Bob to visit all the tunnels, output -1.
Sample Input
5 4 ....# ...#. ..... ..... ..... 2 3 1 4 1 2 3 5 2 3 3 1 5 4 2 1
Sample Output
7
Source
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 20; 18 struct Tunnels { 19 int u,v,x,y; 20 }; 21 Tunnels e[maxn]; 22 int n,m,g[maxn][maxn],dp[1<<15][maxn]; 23 char mp[maxn][maxn]; 24 int bfs(Tunnels &a,const Tunnels &b) { 25 queue< pii >q; 26 static int vis[maxn][maxn]; 27 static const int dir[4][2] = {0,-1,-1,0,1,0,0,1}; 28 memset(vis,-1,sizeof(vis)); 29 q.push(make_pair(a.x,a.y)); 30 vis[a.x][a.y] = 0; 31 while(!q.empty()) { 32 pii now = q.front(); 33 q.pop(); 34 if(now.first == b.u && now.second == b.v) 35 return vis[now.first][now.second]; 36 for(int i = 0; i < 4; i++) { 37 int x = now.first+dir[i][0]; 38 int y = now.second+dir[i][1]; 39 if(vis[x][y] > -1 || mp[x][y] == '#') continue; 40 vis[x][y] = vis[now.first][now.second]+1; 41 q.push(make_pair(x,y)); 42 } 43 } 44 return -1; 45 } 46 int main() { 47 while(~scanf("%d %d",&n,&m)) { 48 memset(mp,'#',sizeof(mp)); 49 for(int i = 1; i <= n; i++) 50 scanf("%s",mp[i]+1); 51 for(int i = 1; i <= m; i++) 52 scanf("%d %d %d %d",&e[i].u,&e[i].v,&e[i].x,&e[i].y); 53 for(int i = 1; i <= m; i++) { 54 for(int j = 1; j <= m; j++) 55 g[i][j] = bfs(e[i],e[j]); 56 } 57 memset(dp,INF,sizeof(dp)); 58 for(int i = 1; i <= m; i++) dp[1<<(i-1)][i] = 0; 59 int ans = INF; 60 for(int i = 1,M = 1 << m; i < M; i++) { 61 for(int j = 1; j <= m; j++) { 62 if(i&(1<<(j-1))) { 63 for(int k = 1; k <= m; k++) { 64 if(k == j || (i&(1<<(k-1)) == 0) || g[k][j] == -1) continue; 65 dp[i][j] = min(dp[i][j],dp[i^(1<<(j-1))][k]+g[k][j]); 66 } 67 } 68 if(i == M-1) ans = min(ans,dp[i][j]); 69 } 70 } 71 printf("%d\n",ans == INF?-1:ans); 72 } 73 return 0; 74 }