#include<bits/stdc++.h> usingnamespacestd; constint d[][2]={0,1,0,-1,1,0,-1,0}; int n,m; char a[255][255]; intmain(){ int T,kase=0; cin>>T; for (kase=1;kase<=T;kase++){ cin>>n>>m; queue<pair<int,int>>q; for (int i=0;i<n;i++) for (int j=0;j<m;j++){ cin>>a[i][j]; if (a[i][j]=='1')q.push({i,j}); } if (q.size()>=n*m-1){ printf("Case #%d: %d\n",kase,0); continue; } for (int k=1;;k++){ int len=q.size(); for (int ii=0;ii<len;ii++){ auto t=q.front();q.pop(); for (int i=0;i<4;i++){ int tx=t.first+d[i][0],ty=t.second+d[i][1]; if (tx>=0&&ty>=0&&tx<n&&ty<m&&a[tx][ty]!='1'){ a[tx][ty]='1'; q.push({tx,ty}); } } } vector<int> ax,ay; int maxp=-1e9,maxm=-1e9,minp=1e9,minm=1e9; for (int i=0;i<n;i++) for (int j=0;j<m;j++) if (a[i][j]!='1'){ ax.push_back(i),ay.push_back(j); maxp=max(maxp,i+j); minp=min(minp,i+j); maxm=max(maxm,i-j); minm=min(minm,i-j); } if (ax.empty()){ printf("Case #%d: %d\n",kase,k); break; } vector<int>mx,my; for (int i=0;i<ax.size();i++) if (ax[i]+ay[i]==maxp||ax[i]+ay[i]==minp|| ax[i]-ay[i]==maxm||ax[i]-ay[i]==minm) mx.push_back(ax[i]),my.push_back(ay[i]); bool f=0; for (int xi=0;xi<n;xi++) for (int yi=0;yi<m;yi++){ bool ff=0; for (int j=0;j<mx.size();j++) if (abs(xi-mx[j])+abs(yi-my[j])>k){ ff=1; break; } if (!ff){ f=1; break; } } if (f){ printf("Case #%d: %d\n",kase,k); break; } } } }