OCR识别题解
可以发现的不同之处在于
没有环,
有一个环,
有两个环,那么只需要判断有多少个环就可以就可以判断不同的字母了。我们先把输入的图拆分成单个的数字(通过空白列),然后去先把数字周围'.'去掉(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;
}
};
查看7道真题和解析