1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include<bits/stdc++.h> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std;
typedef long long LL;
const int maxn=205;
int n,m; char s[maxn][maxn];
int ga[maxn*maxn],num; int get(int x) {return ga[x]==x ?x :ga[x]=get(ga[x]) ;} void merge(int x,int y) { x=get(x), y=get(y); if (x!=y) ga[x]=y, num--; } void clear_ga() { for(int x=0; x<n*m; x++) ga[x]=x; num=0; }
inline int id(int x,int y) {return x*m+y;}
int prega[maxn][maxn],sufga[maxn][maxn],prenum[maxn],sufnum[maxn]; vector<pair<int,int>> ans; int main() { scanf("%d %d",&n,&m); fo(i,0,n-1) scanf("%s",s[i]); for(int i=0; i<n; i++) { clear_ga(); for(int j=0; j<m; j++) { for(int x=0; x<n; x++) num+=(s[(i+x)%n][j]=='.'); for(int x=0; x<n; x++) { int curi=(i+x)%n; if (j && s[curi][j-1]=='.' && s[curi][j]=='.') merge(id(curi,j-1),id(curi,j)); if (x<n-1 && s[curi][j]=='.' && s[(curi+1)%n][j]=='.') merge(id(curi,j),id((curi+1)%n,j)); } for(int x=0; x<n; x++) prega[j][(i+x)%n]=get(id((i+x)%n,0)); prenum[j]=num; } clear_ga(); for(int j=m-1; j>=0; j--) { for(int x=0; x<n; x++) num+=(s[(i+x)%n][j]=='.'); for(int x=0; x<n; x++) { int curi=(i+x)%n; if (j<m-1 && s[curi][j+1]=='.' && s[curi][j]=='.') merge(id(curi,j+1),id(curi,j)); if (x<n-1 && s[curi][j]=='.' && s[(curi+1)%n][j]=='.') merge(id(curi,j),id((curi+1)%n,j)); } for(int x=0; x<n; x++) sufga[j][(i+x)%n]=get(id((i+x)%n,m-1)); sufnum[j]=num; } for(int j=0; j<m; j++) { if (j==0) { num=sufnum[j]; } else { num=prenum[j-1]+sufnum[j]; for(int x=0; x<n; x++) { int t=ga[id((i+x)%n,0)]=prega[j-1][(i+x)%n]; ga[t]=t; t=ga[id((i+x)%n,m-1)]=sufga[j][(i+x)%n]; ga[t]=t; } for(int x=0; x<n; x++) if (s[(i+x)%n][0]=='.' && s[(i+x)%n][m-1]=='.') merge(id((i+x)%n,0),id((i+x)%n,m-1)); } if (num==1) ans.push_back(make_pair(i,j)); } } printf("%d\n",ans.size()); for(auto p:ans) printf("%d %d\n",p.first,p.second); }
|