#include <cstdio> #include <queue> using namespace std; int n,m,k; unsigned long long int a[1000002]; unsigned long long int b[1000002]; char c[2002][2002]; char tmp; int main() { scanf("%d %d %d\n", &n, &m, &k); for(int i = 1; i<=n;i++) { for(int j = 1; j<=m; j++) { scanf("%c", &c[i][j]); } scanf("%c", &tmp); } for (int i = 0; i < k; ++i) { scanf("%llu %llu", &a[i], &b[i]); } for (int j=0; j<=m; j++) c[0][j] = c[n+1][j] = 'X'; for (int i = 0; i <=n + 1; ++i) c[i][0] = c[i][m+1] = 'X'; m++; n++; // printf(" "); // for(int j = 0; j<=m+1; j++) { // printf("%d",j); // }printf("\n"); // for(int i = 0; i<=n+1;i++) { // printf("%d:", i); // for(int j = 0; j<=m+1; j++) { // printf("%c", c[i][j]); // } // printf("\n"); // } // BFS c[1][1] = 'S'; queue<int> q; q.push (m + 1); while(!q.empty()) { int idx = q.front(); q.pop(); int i = idx / m; int j = idx % m; if (i == n-1 && j==m-1) { break; } if(c[i+1][j] == '.') { c[i+1][j] = 'U'; q.push(m*(i+1) + j); } if(c[i-1][j] == '.') { c[i-1][j] = 'D'; q.push(m*(i-1) + j); } if(c[i][j+1] == '.') { c[i][j+1] = 'L'; q.push(m*i + j+1); } if(c[i][j-1] == '.') { c[i][j-1] = 'R'; q.push(m*i + j-1); } } // printf(" "); // for(int j = 0; j<=m+1; j++) { // printf("%d",j); // }printf("\n"); // for(int i = 0; i<=n+1;i++) { // printf("%d:", i); // for(int j = 0; j<=m+1; j++) { // printf("%c", c[i][j]); // } // printf("\n"); // } // restore path unsigned long long int ups = 0, downs = 0; int i = n-1; int j = m-1; while(c[i][j] != 'S') { char s = c[i][j]; if(s == 'U' || s == 'L') { ups++; } else { downs++; } if (s == 'U') i--; else if (s == 'D') i++; else if (s == 'L') j--; else j++; } // printf("ups %d downs %d\n", ups, downs); for (int i = 0; i < k; ++i) { a[i] = (a[i] * ups) + (b[i] * downs); } int min_count = 1; unsigned long long int min = a[0]; for (int i = 1; i < k; ++i) { if( a[i] < min) { min = a[i]; min_count = 1; } else if (a[i] == min) { min_count++; } } printf("%llu %d\n", min, min_count); }
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 118 119 120 121 122 123 124 125 126 | #include <cstdio> #include <queue> using namespace std; int n,m,k; unsigned long long int a[1000002]; unsigned long long int b[1000002]; char c[2002][2002]; char tmp; int main() { scanf("%d %d %d\n", &n, &m, &k); for(int i = 1; i<=n;i++) { for(int j = 1; j<=m; j++) { scanf("%c", &c[i][j]); } scanf("%c", &tmp); } for (int i = 0; i < k; ++i) { scanf("%llu %llu", &a[i], &b[i]); } for (int j=0; j<=m; j++) c[0][j] = c[n+1][j] = 'X'; for (int i = 0; i <=n + 1; ++i) c[i][0] = c[i][m+1] = 'X'; m++; n++; // printf(" "); // for(int j = 0; j<=m+1; j++) { // printf("%d",j); // }printf("\n"); // for(int i = 0; i<=n+1;i++) { // printf("%d:", i); // for(int j = 0; j<=m+1; j++) { // printf("%c", c[i][j]); // } // printf("\n"); // } // BFS c[1][1] = 'S'; queue<int> q; q.push (m + 1); while(!q.empty()) { int idx = q.front(); q.pop(); int i = idx / m; int j = idx % m; if (i == n-1 && j==m-1) { break; } if(c[i+1][j] == '.') { c[i+1][j] = 'U'; q.push(m*(i+1) + j); } if(c[i-1][j] == '.') { c[i-1][j] = 'D'; q.push(m*(i-1) + j); } if(c[i][j+1] == '.') { c[i][j+1] = 'L'; q.push(m*i + j+1); } if(c[i][j-1] == '.') { c[i][j-1] = 'R'; q.push(m*i + j-1); } } // printf(" "); // for(int j = 0; j<=m+1; j++) { // printf("%d",j); // }printf("\n"); // for(int i = 0; i<=n+1;i++) { // printf("%d:", i); // for(int j = 0; j<=m+1; j++) { // printf("%c", c[i][j]); // } // printf("\n"); // } // restore path unsigned long long int ups = 0, downs = 0; int i = n-1; int j = m-1; while(c[i][j] != 'S') { char s = c[i][j]; if(s == 'U' || s == 'L') { ups++; } else { downs++; } if (s == 'U') i--; else if (s == 'D') i++; else if (s == 'L') j--; else j++; } // printf("ups %d downs %d\n", ups, downs); for (int i = 0; i < k; ++i) { a[i] = (a[i] * ups) + (b[i] * downs); } int min_count = 1; unsigned long long int min = a[0]; for (int i = 1; i < k; ++i) { if( a[i] < min) { min = a[i]; min_count = 1; } else if (a[i] == min) { min_count++; } } printf("%llu %d\n", min, min_count); } |