#include <bits/stdc++.h> using namespace std; constexpr int maxN = 8+7; int n,m,A,B,AA,BB; long long parz,nieparz; char start[maxN][maxN],koniec[maxN][maxN]; long double ostatnie,wszystkie,ans; bool wypisz_0; long long newton(int a, int b){ if(b > a) return 0; long long res = 1; for(int i=a;i>a-b;i--) res *= i; return res; } void ruch(int x, int y, int xx, int yy){ if(xx == 0 || xx == n+1 || yy == 0 || yy == m+1) return; bool parz = (xx + yy) & 1; /// 0 - parzyste, 1 - nieparzyste for(int i=0;i<A+B;i++){ /// tyle parzystych int aa = i + parz; if((A - aa) & 1) continue; long long na_parzyste = i, na_nieparzyste = A+B-1-i; long long dodaj = newton(parz, na_parzyste) * newton(nieparz, na_nieparzyste); if(dodaj < (long long)1e17) wszystkie += dodaj; } if(wszystkie >= 1e17) wypisz_0 = true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>start[i][j]; if(start[i][j] == '.') continue; if((i + j)&1) B++; else A++; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>koniec[i][j]; if(koniec[i][j] == '.') continue; if((i + j)&1) BB++; else AA++; } } if(A+B != AA+BB || (A-AA)%2 != 0){ cout<<0<<"\n"; return 0; } /// wszystkie pola na planszy parz = n*m/2; nieparz = parz; if((n * m) & 1) nieparz++; parz--, nieparz--; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ruch(i,j,i+1,j); ruch(i,j,i-1,j); ruch(i,j,i,j+1); ruch(i,j,i,j-1); } } if(wypisz_0){ cout<<0<<"\n"; return 0; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(koniec[i][j] == 'O'){ if(koniec[i-1][j] == '.') ostatnie++; if(koniec[i+1][j] == '.') ostatnie++; if(koniec[i][j-1] == '.') ostatnie++; if(koniec[i][j+1] == '.') ostatnie++; } } } //cout<<A<<' '<<B<<' '<<AA<<' '<<BB<<' '<<ostatnie<<"\n"; ans = ostatnie/wszystkie; cout<<fixed<<setprecision(13)<<ans<<"\n"; } /* 1 5 O.... ....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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <bits/stdc++.h> using namespace std; constexpr int maxN = 8+7; int n,m,A,B,AA,BB; long long parz,nieparz; char start[maxN][maxN],koniec[maxN][maxN]; long double ostatnie,wszystkie,ans; bool wypisz_0; long long newton(int a, int b){ if(b > a) return 0; long long res = 1; for(int i=a;i>a-b;i--) res *= i; return res; } void ruch(int x, int y, int xx, int yy){ if(xx == 0 || xx == n+1 || yy == 0 || yy == m+1) return; bool parz = (xx + yy) & 1; /// 0 - parzyste, 1 - nieparzyste for(int i=0;i<A+B;i++){ /// tyle parzystych int aa = i + parz; if((A - aa) & 1) continue; long long na_parzyste = i, na_nieparzyste = A+B-1-i; long long dodaj = newton(parz, na_parzyste) * newton(nieparz, na_nieparzyste); if(dodaj < (long long)1e17) wszystkie += dodaj; } if(wszystkie >= 1e17) wypisz_0 = true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>start[i][j]; if(start[i][j] == '.') continue; if((i + j)&1) B++; else A++; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>koniec[i][j]; if(koniec[i][j] == '.') continue; if((i + j)&1) BB++; else AA++; } } if(A+B != AA+BB || (A-AA)%2 != 0){ cout<<0<<"\n"; return 0; } /// wszystkie pola na planszy parz = n*m/2; nieparz = parz; if((n * m) & 1) nieparz++; parz--, nieparz--; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ruch(i,j,i+1,j); ruch(i,j,i-1,j); ruch(i,j,i,j+1); ruch(i,j,i,j-1); } } if(wypisz_0){ cout<<0<<"\n"; return 0; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(koniec[i][j] == 'O'){ if(koniec[i-1][j] == '.') ostatnie++; if(koniec[i+1][j] == '.') ostatnie++; if(koniec[i][j-1] == '.') ostatnie++; if(koniec[i][j+1] == '.') ostatnie++; } } } //cout<<A<<' '<<B<<' '<<AA<<' '<<BB<<' '<<ostatnie<<"\n"; ans = ostatnie/wszystkie; cout<<fixed<<setprecision(13)<<ans<<"\n"; } /* 1 5 O.... ....O */ |