#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int N=210;
int f[2][N][N][N],g[2][N][N][N];
int n,m,sum[N][N];
bool full(int xa,int ya,int xb,int yb){
	int all=(xb-xa+1)*(yb-ya+1),s=sum[xb][yb]+sum[xa-1][ya-1]-sum[xa-1][yb]-sum[xb][ya-1];
	return !s||all==s;	
}
char s[N];
int main(){
	//freopen("a.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){scanf("%s",s+1);
		for(int j=1;j<=m;j++)sum[i][j]=(s[j]=='#'),sum[i][j]+=sum[i][j-1];
	}
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)sum[i][j]+=sum[i-1][j];
	int cur=0;
	for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)for(int c=1;c<=m;c++){
		int t=f[0][i][j][c-1];
		if(t<c&&full(i,c,j,c)) t=c;
		if(t>=c)while(t<m&&full(i,c,j,t+1))t++;else t=c-1;
		f[0][i][j][c]=t;
	}
	for(int i=1;i<=m;i++)for(int j=i;j<=m;j++)for(int c=1;c<=n;c++){
		int t=g[0][i][j][c-1];
		if(t<c&&full(c,i,c,j)) t=c;
		if(t>=c)while(t<n&&full(c,i,t+1,j)) t++;else t=c-1;
		g[0][i][j][c]=t;
	}
	for(int ans=0;ans<=20;ans++){
		if(f[cur][1][n][1]>=m){printf("%d\n",ans);return 0;}
		cur^=1;memset(g[cur],0,sizeof(g[cur]));
		memset(f[cur],0,sizeof(f[cur]));
		for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int c=1;c<=m;c++){
			int t=f[cur^1][i][j][c];if(t>=m){f[cur][i][j][c]=m;continue;}
			t=f[cur^1][i][j][t+1];
			while(t<m){
				int d=g[cur^1][c][t+1][i];
				d=g[cur^1][c][t+1][d+1];
				if(d>=j)t++;else break;
			}f[cur][i][j][c]=t;
		}
		for(int i=1;i<=m;i++)for(int j=i;j<=m;j++)for(int c=1;c<=n;c++){
			int t=g[cur^1][i][j][c];if(t>=n){g[cur][i][j][c]=n;continue;}
			t=g[cur^1][i][j][t+1];
			while(t<n){
				int d=f[cur^1][c][t+1][i];
				d=f[cur^1][c][t+1][d+1];
				if(d>=j)t++;else break;
			}g[cur][i][j][c]=t;
		}
	}
}