#include<bits/stdc++.h>
#define ll long long
#define pb emplace_back
#define mr make_pair
#define N 187
using namespace std;
int m,n,a[N][N],dp[N][N][N][18];
int ch(int l1,int r1,int l2,int r2){
	int x=a[l2][r2]+a[l1-1][r1-1]-a[l2][r1-1]-a[l1-1][r2];
	if (x==0||x==(l2-l1+1)*(r2-r1+1))return 1;return 0;
}
int main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			char ch=getchar();
			while (ch!='.'&&ch!='#')ch=getchar();
			a[i][j]=(ch=='.');
		}
	}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)a[i][j]+=a[i][j-1];
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)a[i][j]+=a[i-1][j];
	for (int l=1;l<=n;l++){
		for (int r=l;r<=n;r++){
			for (int l1=1;l1<=m;l1++){
				int L=l1-1,R=m,mid;
				while (L<R){mid=(L+R+1)/2;if (ch(l,l1,r,mid))L=mid;else R=mid-1;}
				dp[l][r][l1][0]=L;
			}
		}
	}
	for (int an=1;an<=16;an++){
		for (int le=1;le<=n;le++){
			for (int l=1;l+le-1<=n;l++){
				for (int l1=1;l1<=m;l1++){
					dp[l][l+le-1][l1][an]=dp[l][l+le-1][min(m,dp[l][l+le-1][l1][an-1]+1)][an-1];
					int L=l,R=l+le-1,mid;
					while (L<R){mid=(L+R)/2;if (dp[l][mid][l1][an-1]>dp[mid+1][l+le-1][l1][an-1])L=mid+1;else R=mid;}
					dp[l][l+le-1][l1][an]=max(dp[l][l+le-1][l1][an],
					max(min(dp[l][L-1][l1][an-1],dp[L][l+le-1][l1][an-1]),
					min(dp[l][L][l1][an-1],dp[L+1][l+le-1][l1][an-1])));
				}
			}
		}
	}
	for (int an=0;an<=16;an++){
		if (dp[1][n][1][an]==m){cout<<an<<endl;return 0;}
	}
	return 0;
}