#include <bits/stdc++.h> typedef long long ll; typedef long double ld; using namespace std; const int N=10; int a1[N][N],b[N][N]; int a[N][N]; ll calc(int n,int m){ int cnt=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ if (!a[i][j]) continue; for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++){ if (!dx && !dy) continue; if (dx && dy) continue; if (i+dx<0 || i+dx>=n || j+dy<0 || j+dy>=m) continue; if (a[i+dx][j+dy]) continue; cnt++; } } } } return cnt; } ll C(ll n,ll k){ ll res=1; for (ll i=1;i<=k;i++){ res*=(n-i+1); } for (ll i=1;i<=k;i++) res/=i; return res; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,m;cin>>n>>m; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ char c;cin>>c; a1[i][j]=(c=='O'); } } for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ char c;cin>>c; b[i][j]=(c=='O'); } } int sumA=0,sumB=0; int k=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ k+=a1[i][j]; sumA+=a1[i][j]*(i+j); sumB+=b[i][j]*(i+j); } } sumA%=2; sumB%=2; if (sumA!=sumB){ cout<<0<<'\n'; return 0; } vector<int>v(n*m,0); for (int i=0;i<k;i++){ v[n*m-i-1]=1; } ll cnt=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++){ if (!dx && !dy) continue; if (dx && dy) continue; if (i+dx<0 || i+dx>=n || j+dy<0 || j+dy>=m) continue; cnt+=C(n*m-2,k-1); } } } } cnt/=2; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ a[i][j]=b[i][j]; } } cout<<setprecision(17)<<fixed<<(ld)calc(n,m)/(ld)cnt<<'\n'; return 0; } /** O...... **/
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 89 90 91 92 93 94 | #include <bits/stdc++.h> typedef long long ll; typedef long double ld; using namespace std; const int N=10; int a1[N][N],b[N][N]; int a[N][N]; ll calc(int n,int m){ int cnt=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ if (!a[i][j]) continue; for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++){ if (!dx && !dy) continue; if (dx && dy) continue; if (i+dx<0 || i+dx>=n || j+dy<0 || j+dy>=m) continue; if (a[i+dx][j+dy]) continue; cnt++; } } } } return cnt; } ll C(ll n,ll k){ ll res=1; for (ll i=1;i<=k;i++){ res*=(n-i+1); } for (ll i=1;i<=k;i++) res/=i; return res; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,m;cin>>n>>m; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ char c;cin>>c; a1[i][j]=(c=='O'); } } for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ char c;cin>>c; b[i][j]=(c=='O'); } } int sumA=0,sumB=0; int k=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ k+=a1[i][j]; sumA+=a1[i][j]*(i+j); sumB+=b[i][j]*(i+j); } } sumA%=2; sumB%=2; if (sumA!=sumB){ cout<<0<<'\n'; return 0; } vector<int>v(n*m,0); for (int i=0;i<k;i++){ v[n*m-i-1]=1; } ll cnt=0; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++){ if (!dx && !dy) continue; if (dx && dy) continue; if (i+dx<0 || i+dx>=n || j+dy<0 || j+dy>=m) continue; cnt+=C(n*m-2,k-1); } } } } cnt/=2; for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ a[i][j]=b[i][j]; } } cout<<setprecision(17)<<fixed<<(ld)calc(n,m)/(ld)cnt<<'\n'; return 0; } /** O...... **/ |