1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4 #include <queue>
5 #include <cstdio>
6 #include <algorithm>
7 #include <map>
8 //#include <time.h>
9 //#include <ext/pb_ds/assoc_container.hpp>
10 //#include <ext/pb_ds/tree_policy.hpp>
11 #define LL long long
12
13 using namespace std;
14 //using namespace __gnu_pbds;
15
16 int dp[1<<16][20];
17
18 int n;
19
20 struct nodes
21 {
22 int x, y;
23 int operator - (const nodes &b)const
24 {
25 return max(abs(x - b.x) , abs(y - b.y));
26 }
27 }Point[20];
28
29 int dfs(int statu,int cur)
30 {
31 if(dp[statu][cur] != -1)
32 return dp[statu][cur];
33 if(statu == (1<< (n+1) )-1 && cur == 0)
34 return dp[statu][cur] = 0;
35 dp[statu][cur] = 0x3f3f3f;
36
37 for(int i = 0; i <= n; i++)
38 {
39 if( ((statu >> i)&1) == 1 ) continue;
40 dp[statu][cur] = min(dp[statu][cur], dfs( statu|(1<<i),i ) + (Point[cur]-Point[i]) );
41 }
42
43 return dp[statu][cur];
44 }
45
46 void solve()
47 {
48 memset(dp,-1,sizeof(dp));
49 int row,col;
50 scanf("%d %d",&row,&col);
51 char ss[25];
52 n = 0;
53 for(int i = 1; i <= row; i++)
54 {
55 scanf("%s",ss+1);
56 for(int j = 1; j <= col; j++)
57 if(ss[j] == 'x')
58 {
59 Point[0].x = i;
60 Point[0].y = j;
61 }
62 else if(ss[j] == 'g')
63 {
64 Point[++n].x = i;
65 Point[n].y = j;
66 }
67 }
68 int ans = dfs(0,0);
69 printf("%d\n",ans);
70 }
71
72
73 int main(void)
74 {
75 int t,cnt = 0;
76 scanf("%d",&t);
77 while(t--)
78 {
79 printf("Case %d: ",++cnt);
80 solve();
81 }
82 return 0;
83 }