#include<cstdio> #include<algorithm> #include<vector> #include<iostream> using namespace std; typedef long double ld; char T[10][10]; int main(void){ int n,m; scanf("%d %d",&n,&m); char c; int p = 0; int k = 0; int k2 = 0; int p2 = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ scanf(" %c",&c); if(c == 'O'){ k++; if((i+j)%2 == 0) p++; } } } for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ scanf(" %c",&c); T[i][j] = c; if(c == 'O'){ k2++; if((i+j)%2 == 0) p2++; } } } if(k != k2 || (p%2 != p2%2)){ printf("0"); return 0; } int moves = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ if(i != 1 && T[i][j] != T[i-1][j]) moves++; if(j != 1 && T[i][j] != T[i][j-1]) moves++; } } vector < int > M; for(int i = 1; i <= k-1;i++){ M.push_back(i); } ld ans = 1; for(int i = n*m-2-(k-1)+1; i <= n*m-2;i++){ int b = i; for(int j = 0; j < M.size();j++){ int p = __gcd(b,M[j]); M[j] /= p; b /= p; } ans *= b; } if(k == 1) ans = 1; ans *= ((n-1) * m + (m-1) * n); //cout << ans << "\n"; ans = (ld)moves/ans; printf("%.16Lf",ans); return 0; } /* 1 7 ..OOOOO ..OOOOO 1 7 OO..... OO..... */
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 | #include<cstdio> #include<algorithm> #include<vector> #include<iostream> using namespace std; typedef long double ld; char T[10][10]; int main(void){ int n,m; scanf("%d %d",&n,&m); char c; int p = 0; int k = 0; int k2 = 0; int p2 = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ scanf(" %c",&c); if(c == 'O'){ k++; if((i+j)%2 == 0) p++; } } } for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ scanf(" %c",&c); T[i][j] = c; if(c == 'O'){ k2++; if((i+j)%2 == 0) p2++; } } } if(k != k2 || (p%2 != p2%2)){ printf("0"); return 0; } int moves = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= m;j++){ if(i != 1 && T[i][j] != T[i-1][j]) moves++; if(j != 1 && T[i][j] != T[i][j-1]) moves++; } } vector < int > M; for(int i = 1; i <= k-1;i++){ M.push_back(i); } ld ans = 1; for(int i = n*m-2-(k-1)+1; i <= n*m-2;i++){ int b = i; for(int j = 0; j < M.size();j++){ int p = __gcd(b,M[j]); M[j] /= p; b /= p; } ans *= b; } if(k == 1) ans = 1; ans *= ((n-1) * m + (m-1) * n); //cout << ans << "\n"; ans = (ld)moves/ans; printf("%.16Lf",ans); return 0; } /* 1 7 ..OOOOO ..OOOOO 1 7 OO..... OO..... */ |