北美競賽-加拿大計算機競賽CCC-收穫滑鐵盧

kkman2000發表於2024-11-17

給定一個 R×CR×C 的方格矩陣。

矩陣左上角方格座標為 (0,0)(0,0),右下角方格座標為 (R1,C1)(R−1,C−1)

每個方格中要麼有南瓜,要麼有乾草。

南瓜分為大、中、小三種。

初始時,一個農民位於方格 (A,B)(A,B)

他可以朝上下左右四個方向自由移動,但是他不能走出矩陣,也不能走進有乾草的方格。

他每走進一個方格就可以將方格內的南瓜收走。

每個小南瓜價值 11 元,每個中南瓜價值 55 元,每個大南瓜價值 1010 元。

請你計算,他可以收穫的全部南瓜的總價值。

保證農名的初始位置有南瓜。

輸入格式

第一行包含整數 RR

第二行包含整數 CC

接下來 RR 行,每行 CC 個字元,表示方格矩陣的具體分佈。其中,大南瓜用 L 表示,中南瓜用 M 表示,小南瓜用 S 表示,乾草用 *

再一行包含整數 AA

最後一行包含整數 BB

輸出格式

一個整數,表示可以收穫的全部南瓜的總價值。

資料範圍

1R×C1051≤R×C≤105,
0A<R0≤A<R,
0B<C0≤B<C

輸入樣例1:

6
6
**LMLS
S*LMMS
S*SMSM
******
LLM*MS
SSL*SS
5
1

輸出樣例1:

37

樣例1解釋

矩陣的具體分佈圖如下所示,農民的可活動範圍為黃色區域。

QQ截圖20240719145857.png

農民一共可以收穫 22 個小南瓜,11 箇中南瓜,33 個大南瓜,總價值為 2×1+1×5+3×10=372×1+1×5+3×10=37

輸入樣例2:

6
6
**LMLS
S*LMMS
S*SMSM
***SLL
LLM*MS
SSL*SS
2
4

輸出樣例2:

88

樣例2解釋

矩陣的具體分佈圖如下所示,農民的可活動範圍為黃色區域。

QQ截圖20240719150211.png

農民一共可以收穫 88 個小南瓜,66 箇中南瓜,55 個大南瓜,總價值為 8×1+6×5+5×10=888×1+6×5+5×10=88

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int n, m;
vector<string> g;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
 
int get_score(char c)
{
    if (c == 'S') return 1;
    if (c == 'M') return 5;
    return 10;
}
 
int dfs(int x, int y)
{
    int res = get_score(g[x][y]);
    g[x][y] = '*';
 
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '*') continue;
        res += dfs(a, b);
    }
    return res;
}
 
int main()
{
    cin >> n >> m;
    g.resize(n);//表示將vector的大小調整為n
    for (int i = 0; i < n; i ++ ) cin >> g[i];
 
    int x, y;
    cin >> x >> y;
    cout << dfs(x, y) << endl;
    return 0;
}
 

相關文章