可以发现的不同之处在于没有环,有一个环,有两个环,那么只需要判断有多少个环就可以就可以判断不同的字母了。我们先把输入的图拆分成单个的数字(通过空白列),然后去先把数字周围'.'去掉(dfs边缘),再去挨着遍历图,如果出现'.'就把这个'.'点及周围的所有'.'都标记,统计进行的次数来求得答案。时间复杂度,空间复杂度

const int N=550;
char s[N][N],mp[N][N],ans[N];
int cnt[N];
bool vis[N][N];
vector<int> v;
void dfs(int x,int y,int n,int m) {
    if(x<1||y<1||x>n||y>m||vis[x][y]||mp[x][y]=='#')return ;
    vis[x][y]=1;
    dfs(x-1,y,n,m);
    dfs(x+1,y,n,m);
    dfs(x,y-1,n,m);
    dfs(x,y+1,n,m);
}
int gao(int n,int m) {
    memset(vis,0,sizeof vis);
    int sum=0;
    for(int i=1;i<=n;i++) dfs(i,1,n,m),dfs(i,m,n,m);
    for(int i=1;i<=m;i++) dfs(1,i,n,m),dfs(n,i,n,m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) if(!vis[i][j]&&mp[i][j]=='.'){
            sum++;
            dfs(i,j,n,m);
        }
    if(sum==0)return 1;
    if(sum==1)return 0;
    return 8;
}
class Solution {
public:
    /**
     * 
     * @param Picture string字符串vector Picture
     * @return string字符串
     */
    string OCR(vector<string>& Picture) {
        // write code here
        for(int i=0;i<Picture.size();i++) 
            for(int j=0;j<Picture[i].length();j++)
                s[i+1][j+1]=Picture[i][j];
        int n=Picture.size(),m=Picture[0].length();
        for(int i=1;i<=m;i++) for(int j=1;j<=n;j++)
            cnt[i]+=s[j][i]-'.';
        v.push_back(0);
        for(int i=1;i<=m;i++) if(!cnt[i])
            v.push_back(i);
        v.push_back(m+1);
        for(int x=1;x<v.size();x++) {
            for(int i=1,k=1;i<=n;i++,k++)
                for(int j=v[x-1]+1,h=1;j<v[x];j++,h++)
                    mp[k][h]=s[i][j];
            ans[x]='0'+gao(n,v[x]-v[x-1]-1);
        }
        string ss=ans+1;
        return ss;
    }
};