CF24D Broken robot 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define re registerconst int MAXn = 1e3;const int MAXm = 1e3;template <class T> inline void read(T &a) { register char c;while (c = getchar(), c < '0' || c > '9');register T x(c - '0');while (c = getchar(), c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);}a = x; }int n, m, x, y;double mat[MAXm + 10][MAXm + 10], d[MAXn + 10][MAXm + 10];signed main() { read(n), read(m); read(x), read(y); if (m == 1) { printf("%d\n", 2 * (n - x)); return 0; } for (re int i = n - 1; i >= x; --i) { memset(mat, 0, sizeof(mat)); mat[1][1] = 2; mat[1][2] = -1; mat[1][m + 1] = d[i + 1][1] + 3; for (re int j = 2; j < m; ++j) { mat[j][j - 1] = mat[j][j + 1] = -1; mat[j][j] = 3; mat[j][m + 1] = d[i + 1][j] + 4; } mat[m][m] = 2; mat[m][m - 1] = -1; mat[m][m + 1] = d[i + 1][m] + 3; // ------- 高斯消元 begin ------- for (re int i = 1; i < m; ++i) { double solve = mat[i + 1][i] / mat[i][i]; mat[i + 1][i] -= mat[i][i] * solve; if (i != m) { mat[i + 1][i + 1] -= mat[i][i + 1] * solve; } mat[i + 1][m + 1] -= mat[i][m + 1] * solve; } for (re int i = m; i > 1; --i) { double solve = mat[i - 1][i] / mat[i][i]; mat[i - 1][i] -= mat[i][i] * solve; mat[i - 1][m + 1] -= mat[i][m + 1] * solve; } // ------- 高斯消元 end ------- for (re int j = 1; j <= m; ++j) { d[i][j] = mat[j][m + 1] / mat[j][j]; } } printf("%.4f\n", d[x][y]);}