#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...... **/ |
English