License Plate Recognition(HDU多校)
题目分析:DFS,求连通块最左及最右所在列数。
PS:注意汉字“川”等不是连在一起的,所以需要从后往前扫六个。
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
char s[40][110];
bool vis[40][110];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int l,r,cnt,n,m;
vector <pair<int,int> > v;
void dfs(int x,int y){
vis[x][y]=1;
l=min(y,l);
r=max(y,r);
for(int i=0;i<4;++i){
int dx=dir[i][0]+x, dy=dir[i][1]+y;
if(dx>=1 && dx<=n && dy>=1 && dy<=m && !vis[dx][dy] && s[dx][dy]=='#'){
dfs(dx,dy);
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cnt++;
v.clear();
memset(vis,0,sizeof(vis));
n=30,m=100;
for(int i=1;i<=n;i++){
cin>>s[i]+1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!vis[i][j] && s[i][j]=='#'){
l=m+1,r=-1;
dfs(i,j);
v.push_back({l,r});
}
}
}
sort(v.begin(),v.end());
printf("Case #%d:\n",cnt);
l=m+1,r=-1;
for(int i=0;i<v.size()-6;++i){
l=min(l,v[i].first);
r=max(r,v[i].second);
}
printf("%d %d\n",l,r);
for(int i=v.size()-6;i<v.size();i++){
printf("%d %d\n",v[i].first,v[i].second);
}
}
return 0;
}