結果
問題 | No.659 徘徊迷路 |
ユーザー | tetsu |
提出日時 | 2018-03-03 00:08:34 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,419 bytes |
コンパイル時間 | 769 ms |
コンパイル使用メモリ | 76,032 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-23 00:14:02 |
合計ジャッジ時間 | 1,828 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 6 ms
6,816 KB |
testcase_01 | AC | 13 ms
6,940 KB |
testcase_02 | AC | 34 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 34 ms
6,944 KB |
testcase_05 | WA | - |
testcase_06 | AC | 11 ms
6,944 KB |
testcase_07 | AC | 11 ms
6,944 KB |
testcase_08 | AC | 16 ms
6,940 KB |
testcase_09 | AC | 35 ms
6,944 KB |
testcase_10 | AC | 39 ms
6,940 KB |
testcase_11 | AC | 40 ms
6,944 KB |
testcase_12 | AC | 9 ms
6,944 KB |
testcase_13 | AC | 36 ms
6,944 KB |
testcase_14 | AC | 35 ms
6,944 KB |
testcase_15 | AC | 41 ms
6,944 KB |
testcase_16 | AC | 40 ms
6,940 KB |
ソースコード
#include <cstdio> #include <string> #include <iostream> #include <vector> using namespace std; #define MAX 1000001 typedef vector<double> vec; typedef vector<vec> mat; char map[10][10]; int r, c, t, sx, sy, gx, gy; int ds[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; mat mul(mat &A, mat &B) { mat C(A.size(), vec(B[0].size())); for(int i=0; i<A.size(); i++) { for(int k=0; k<B.size(); k++) { for(int j=0; j<B[0].size(); j++) { C[i][j] = (C[i][j]+A[i][k]*B[k][j]); } } } return C; } void printMat(mat &A) { int n = A.size(); int m = A[0].size(); for(int i=0; i<r*c; i++) { for(int j=0; j<r*c; j++) { printf("%f ", A[i][j]); } printf("\n"); } } mat pow(mat A, long n) { mat B(A.size(), vec(A.size())); for(int i=0; i<A.size(); i++) { B[i][i] = 1; } while(n>0) { if(n&1) B = mul(B, A); A = mul(A, A); n >>= 1; } return B; } double solve() { { int unko = 0; for(int k=0; k<4; k++) { int ny = sy+ds[k][0]; int nx = sx+ds[k][1]; if(0<=ny && ny < r && 0<=nx && nx < c && map[ny][nx] == '.') unko++; } //printf("unko=%d, sx=%d, gx=%d, sy=%d, gy=%d\n", unko, sx, gx, sy, gy); // if(unko==0 && sx==gx && sy==gy) return 1; } mat A(101, vec(101)); for(int y=0; y<r; y++) { for(int x=0; x<c; x++) { A[y][x] = 0; } } //printMat(A); for(int y=0; y<r; y++) { for(int x=0; x<c; x++) { if(map[y][x]=='.') { int tmp = 0; for(int k=0; k<4; k++) { int ny = y+ds[k][0]; int nx = x+ds[k][1]; if(0<=ny && ny < r && 0<=nx && nx < c && map[ny][nx] == '.') tmp++; } if(tmp==0) continue; int current = r*y+x; //printf("@@@@@\n"); //printf("y: %d, x: %d, tmp: %d\n", y, x, tmp); for(int k=0; k<4; k++) { int ny = y+ds[k][0]; int nx = x+ds[k][1]; if(0<=ny && ny < r && 0<=nx && nx < c && map[ny][nx] == '.') { int next = r*ny+nx; // printf("%d -> %d = %f\n", c, n, (double)1/(double)tmp); A[current][next] = (double)1/(double)tmp; //printf("A[c][n]=%f\n", A[current][next]); } } //printf("@@@@@\n"); } //if(y==0) printMat(A); } } //printMat(A); A = pow(A, t); return A[r*sy+sx][r*gy+gx]; } int main() { cin >> r >> c >> t >> sy >> sx >> gy >> gx; for(int i=0; i<r; i++) { scanf("%s", &map[i]); } // for(int i=0; i<r; i++) { // printf("%s\n", map[i]); // } cout << solve() << '\n'; return 0; }