Pagini recente » Cod sursa (job #1855827) | Cod sursa (job #3211679) | Cod sursa (job #322829) | Cod sursa (job #2955213) | Cod sursa (job #1822508)
#include <bits/stdc++.h>
using namespace std;
typedef double f64;
const int SPQR = 22 * 22 + 5;
const f64 EPS = 1e-9;
int n, m;
valarray<f64> gs[SPQR];
int cod[23][23];
inline bool eq(const f64 &a, const f64 &b) {
return abs(a - b) < EPS; }
int main(void) {
ifstream fi("minesweeper.in");
ofstream fo("minesweeper.out");
int t;
fi >> n >> t;
n *= t;
for (int i = 0; i <= n; ++i)
for (int j = 0; i + j <= n; ++j)
cod[i][j] = m++; // I'm a shame...
for (int i = 0; i <= n; ++i)
for (int j = 0; i + j <= n; ++j)
gs[cod[i][j]].resize(m + 1);
for (int k, i = 0; i <= n; ++i) {
for (int j = 0; i + j <= n; ++j) {
if (i == 0 && j == 0) {
gs[cod[i][j]][cod[i][j]] = 1.0;
continue; }
k = n - i - j;
gs[cod[i][j]][m] = -1.0;
gs[cod[i][j]][cod[i][j]] = -1.0;
if (i > 0) gs[cod[i][j]][cod[i - 1][j + 1]] = i / f64(n);
if (j > 0) gs[cod[i][j]][cod[i][j - 1]] = j / f64(n);
if (k > 0) gs[cod[i][j]][cod[i + 1][j]] = k / f64(n); } }
for (int k, i = 0, j = 0; i < m && j < m; ++j) {
if (eq(gs[i][j], 0.0)) {
for (k = i; k < m; ++k) if (!eq(gs[k][j], 0.0)) {
swap(gs[k], gs[i]);
break; }
if (k == m)
continue; }
for (k = 0; k < m; ++k) if (k != i && !eq(gs[k][j], 0.0))
gs[k]-= gs[i] * (gs[k][j] / gs[i][j]);
++i; }
fo << setprecision(5) << fixed;
fo << gs[cod[n][0]][m] / gs[cod[n][0]][cod[n][0]] << '\n';
return 0; }