#include <bits/stdc++.h>
using namespace std;
int h,w,cnt;
string temp;
vector<string> grid(185);
vector<vector<vector<int>>> yoko(185,vector<vector<int>>(185,vector<int>(185)));
vector<vector<vector<int>>> tate(185,vector<vector<int>>(185,vector<int>(185)));

int main(){
    //入力
    cin >> h >> w;
    for(int i=0;i<h;i++){
        cin >> temp;
        grid[i]=temp;
    }

    //初期化
    for(int i=0;i<h;i++){
        cnt=2;
        yoko[i][i][w-1]=1;
        for(int j=w-2;j>-1;j--){
            if(grid[i][j]==grid[i][j+1]){
                yoko[i][i][j]=cnt;
                cnt+=1;
            }
            else{
                yoko[i][i][j]=1;
                cnt=2;
            }
        }
    }
    for(int i=0;i<w;i++){
        cnt=2;
        tate[i][i][h-1]=1;
        for(int j=h-2;j>-1;j--){
            if(grid[j][i]==grid[j+1][i]){
                tate[i][i][j]=cnt;
                cnt+=1;
            }
            else{
                tate[i][i][j]=1;
                cnt=2;
            }
        }
    }

    for(int k=0;k<w;k++){
        for(int i=0;i<h-1;i++){
            int m=yoko[i][i][k];
            for(int j=i+1;j<h;j++){
                if(grid[j][k]!=grid[j-1][k]){
                    break;
                }
                m=min(yoko[j][j][k],m);
                yoko[i][j][k]=m;
            }

        }
    }

    for(int k=0;k<h;k++){
        for(int i=0;i<w-1;i++){
            int m=tate[i][i][k];
            for(int j=i+1;j<w;j++){
                if(grid[k][j]!=grid[k][j-1]){
                    break;
                }
                m=min(tate[j][j][k],m);
                tate[i][j][k]=m;
            }
        }
    }
    //dp
    for(int c=1;c<18;c++){
        if(yoko[0][h-1][0]==w){
            cout << c-1 << endl;
            break;
        }
        vector<vector<vector<int>>> yoko2(185,vector<vector<int>>(185,vector<int>(185)));
        vector<vector<vector<int>>> tate2(185,vector<vector<int>>(185,vector<int>(185)));
        for(int i=0;i<h;i++){
            for(int j=i;j<h;j++){
                for(int k=0;k<w;k++){
                    int temp=yoko[i][j][k];
                    if(temp+k==w){
                        yoko2[i][j][k]=temp;
                    }
                    else{
                        yoko2[i][j][k]=max(temp+yoko[i][j][k+temp],yoko2[i][j][k]);
                    }
                }
            }
        }
        for(int i=0;i<w;i++){
            for(int j=i;j<w;j++){
                for(int k=0;k<h;k++){
                    int temp=tate[i][j][k];
                    if(temp+k==h){
                        tate2[i][j][k]=temp;
                    }
                    else{
                        tate2[i][j][k]=max(temp+tate[i][j][k+temp],tate2[i][j][k]);
                    }
                }
            }
        }

        for(int i=0;i<h;i++){
            for(int j=i;j<h;j++){
                int l=w-1;
                for(int k=w-1;k>-1;k--){
                    while(k<=l){
                        int temp=tate[k][l][i];
                        if(i+temp>j){
                            yoko2[i][j][k]=max(l-k+1,yoko2[i][j][k]);
                            break;
                        }
                        else if(i+temp+tate[k][l][i+temp]>j){
                            yoko2[i][j][k]=max(l-k+1,yoko2[i][j][k]);
                            break;
                        }
                        else{
                            l-=1;
                        }
                    }
                }
            }
        }
        for(int i=0;i<w;i++){
            for(int j=i;j<w;j++){
                int l=h-1;
                for(int k=h-1;k>-1;k--){
                    while(k<=l){
                        int temp=yoko[k][l][i];
                        if(i+temp>j){
                            tate2[i][j][k]=max(l-k+1,tate2[i][j][k]);
                            break;
                        }
                        else if(i+temp+yoko[k][l][i+temp]>j){
                            tate2[i][j][k]=max(l-k+1,tate2[i][j][k]);
                            break;
                        }
                        else{
                            l-=1;
                        }
                    }
                }
            }
        }
        yoko=yoko2;
        tate=tate2;
    }
}

Measured memory_bytes: 106288