按照題目的規則一步步寫:
1.當所在地score為0,就結束
2.每次都加上所在地的score,並將寶石加一,同時所在地的score減一
3.若score是k的整數倍則右轉90度
4.若下一步會撞牆(=-1)或是超出邊界(<0 或 =m 或=n),則持續右轉直到下一步不會發生上述事件
右轉90度的功能我另外寫了一個函式,先定義全域變數next_r和next_c以便讓main函式和turn_right函式都可以提取。當呼叫turn_right(next_r,next_c)時,next_r、next_c的值會複製給下面定義turn_right(int x,int y)中的x、y,接下來用if判斷x和y的值,當x=1、y=0(表上一動為向下,所以往右轉後變成向左),則讓next_r=0、next_c=-1(表示向左),剩餘情況以此類推
int next_r = 0, next_c = 1;
void turn_right(int, int); //宣告函式
int main() {
int i, j, m, n, k, r,c;
scanf("%d %d %d %d %d",&m,&n,&k,&r,&c);
int map[m][n], score=0, stone=0;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d",&map[i][j]);
}
}
while (1) {
if (map[r][c] == 0) { //當所在地score為0,就結束(跳出while)
break;
}
score += map[r][c]; //以下三行: 每次都加上所在地的score,並將寶石加一,同時所在地的score減一
stone += 1;
map[r][c] -= 1;
if (score%k == 0) { //若score是k的整數倍(即score可以整除k) 則右轉90度
turn_right(next_r,next_c);
}
while (1) {
if (r+next_r == m || r+next_r < 0 || c+next_c == n || c+next_c < 0 || map[r+next_r][c+next_c] == -1) { //判斷是否超出上下左右的邊界和是否撞牆
turn_right(next_r,next_c);
}
else {
break;
}
}
r += next_r;
c += next_c;
}
printf("%d",stone);
return 0;
}
void turn_right(int x, int y) {
if (x == 1 && y == 0) { //原本向下,改為向左
next_r = 0;
next_c = -1;
}
else if (x == 0 && y == 1) { //原本向右,改為向下
next_r = 1;
next_c = 0;
}
else if (x == -1 && y == 0) { //原本向上,改為向右
next_r = 0;
next_c = 1;
}
else if (x == 0 && y == -1) { //原本向左,改為向上
next_r = -1;
next_c = 0;
}
}