#43517: C++ 解(約30行)(作者有考這次APCS)


s111435@whsh.tc.edu.tw (玄霜❆)

學校 : 國立文華高級中學
編號 : 201713
來源 : [27.51.82.244]
最後登入時間 :
2024-10-02 22:27:15
o712. 2. 蒐集寶石 -- 2024年10月APCS | From: [203.68.192.253] | 發表日期 : 2024-10-21 13:10

這次APCS的第二題還蠻簡單,除了基本的二微陣列操作能力,其餘只須照著題目規則寫就可以ACㄌ。
程式碼(解釋於下方):

#include<bits/stdc++.h>

using namespace std;

int main(){
    int m,n,k,r,c;
    cin >> m >> n >> k >> r >> c;

    vector<vector<int>> v(m,vector<int>(n));
    vector<pair<int,int>> face={{0,1},{1,0},{0,-1},{-1,0}};

    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
           cin >> v[i][j];
        }
    }
    int y = r,x = c,gem = 0,score = 0,to = 0;//to means toward
    while(1){
        if(v[y][x]==0) break;
        score += v[y][x];
        v[y][x]--;
        gem++;
        if(score % k == 0) to = (to+1)%4;
        while(y + face[to].first < 0 || y + face[to].first >= m || x + face[to].second < 0 || x + face[to].second >= n || v[y + face[to].first][x + face[to].second] == -1){
            to = (to+1) % 4;
        }
        y += face[to].first;
        x += face[to].second;
    }
    cout << gem << "\n";
}


上面有用到 pair 資料型態,如果不知道可以上網查,這裡簡單說明:就像把原本vector<int>其中每個格子原本只能放一個資料(int型態) 換成pair,pair裡面會有兩格,原本呼叫 vector 裡的 int 是 v[ 第幾格(從0開始) ]變成要呼叫 v[ 第幾格(從0開始) ].first(或second),呼叫第一格就是.first第二格就是 .second

上面的face分別是指右,下,左,上,因此原本的方向是face[0],每次順時針旋轉後會加1代表換方向,%4是因為只有四個方向,順時針旋轉(+1)四次後會回到面向右邊(4%4==0)

 
ZeroJudge Forum