#include #include #include using namespace std; template ostream& operator<<(ostream& os, const vector& vec) { for (auto &vi: vec) os << vi << " "; return os; } template struct Matrix { vector> val; Matrix(int n = 1, int m = 1, T x = 0) { val.assign(n, vector(m, x)); } size_t size() const { return val.size(); } vector& operator[](int i) { return val[i]; } const vector& operator[](int i) const { return val[i]; } friend ostream& operator<<(ostream& os, const Matrix M) { for (int i = 0; i < M.size(); ++i) os << M[i] << " \n"[i != M.size() - 1]; return os; } }; template Matrix operator^(Matrix A, long long n) { Matrix R(A.size(), A.size()); for (int i = 0; i < A.size(); ++i) R[i][i] = 1; while (n > 0) { if (n & 1) R = R * A; A = A * A; n >>= 1; } return R; } template Matrix operator*(const Matrix& A, const Matrix& B) { Matrix R(A.size(), B[0].size()); for (int i = 0; i < A.size(); ++i) for (int j = 0; j < B[0].size(); ++j) for (int k = 0; k < B.size(); ++k) R[i][j] += A[i][k] * B[k][j]; return R; } template vector operator*(const Matrix &A, vector &B) { vector v(A.size()); for (int i = 0; i < A.size(); ++i) for (int k = 0; k < B.size(); ++k) v[i] += A[i][k] * B[k]; return v; } #include int dij[] = { 0, -1, 0, 1, 0 }; int main() { cout << fixed << setprecision(12); int H, W, T; cin >> H >> W >> T; int si, sj, gi, gj; cin >> si >> sj >> gi >> gj; vector field(H); for (string &s: field) cin >> s; Matrix trans(H * W, H * W); auto idx = [&](int i, int j) { return i * W + j; }; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { if (field[i][j] == '#') continue; int cnt = 0; for (int k = 0; k < 4; k++) { int ni = i + dij[k], nj = j + dij[k + 1]; if (ni < 0 || ni >= H || nj < 0 || nj >= W) continue; if (field[ni][nj] == '#') continue; cnt++; } if (cnt == 0) { trans[idx(i, j)][idx(i, j)] = 1.0; } else { for (int k = 0; k < 4; k++) { int ni = i + dij[k], nj = j + dij[k + 1]; if (ni < 0 || ni >= H || nj < 0 || nj >= W) continue; if (field[ni][nj] == '#') continue; trans[idx(ni, nj)][idx(i, j)] = 1.0 / cnt; } } } vector state(H * W); state[idx(si, sj)] = 1; cout << ((trans ^ T) * state)[idx(gi, gj)] << endl; return 0; }