這次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)