相對輕鬆一點的有趣Simulation題目,就是要仔細把文字敘述看清楚,了解遊戲規則。我覺得最重要的應該是這句話:
"A ball ''hits'' an obstacle during a timestep when it would otherwise move on top of the bumper or wall grid point. A hit causes the ball to ``rebound'' by turning right (clockwise) 90 degrees, without ever moving on top of the obstacle and without changing position (only the direction changes as a result of a rebound)."
即是球撞到障礙物(牆或bumper),都會留在原位不動,只改變下一步的方向。
其他就是照著遊戲規則simulation了。Runtime 0.044,Ranking進前100,開心開心。
CODE
#include <stdio.h>
#define MAX 50
#define GAME 0
#define VALUE 1
#define COST 2
#define RIGHT 0
#define UP 1
#define LEFT 2
#define DOWN 3
int m, n, g[3][MAX+1][MAX+1];
int pinball(int x, int y, int dir, int life);
void nextmove(int x, int y, int dir, int *arr);
int chgdir(int dir);
int main(){
int i, j, t;
int x, y, v1, v2, sum;
scanf("%d %d", &m, &n);
scanf("%d", &t); /*cost of hitting the wall*/
/*initialize the pinball game & set walls*/
for(i=1; i<=m; i++){
g[GAME][1][i] = g[GAME][n][i] = 1;
g[VALUE][1][i] = g[VALUE][n][i] = 0;
g[COST][1][i] = g[COST][n][i] = t;
}
for(i=2; i<n; i++){
for(j=1; j<=m; j++){
if( j==1 || j==m ){
g[GAME][i][j] = 1;
g[VALUE][i][j] = 0;
g[COST][i][j] = t;
}
else
g[GAME][i][j] = g[VALUE][i][j] = g[COST][i][j] = 0;
}/*j*/
}/*i*/
/*read bumpers*/
scanf("%d", &t); /*number of bumpers*/
for(i=0; i<t; i++){
scanf("%d %d %d %d", &x, &y, &v1, &v2);
g[GAME][x][y] = 1;
g[VALUE][x][y] = v1;
g[COST][x][y] = v2;
}/*i*/
/*read balls*/
sum = t = 0;
while( scanf("%d %d %d %d", &x, &y, &v1, &v2) != EOF ){
t = pinball(x, y, v1, v2);
sum += t;
printf("%d\n", t);
}/*while*/
printf("%d\n", sum);
exit(0);
}
int pinball(int x, int y, int dir, int life){
int v, move[2];
v = 0;
while( life > 1 ){
nextmove(x, y, dir, move);
if( g[GAME][ move[0] ][ move[1] ] == 1 ){
life -= g[COST][ move[0] ][ move[1] ];
v += g[VALUE][ move[0] ][ move[1] ];
dir = chgdir(dir);
}
else{
x = move[0];
y = move[1];
}
life--;
}/*while life > 1*/
return v;
}
void nextmove(int x, int y, int dir, int *arr){
arr[0] = x;
arr[1] = y;
switch (dir) {
case RIGHT:
arr[0]++;
break;
case UP:
arr[1]++;
break;
case LEFT:
arr[0]--;
break;
case DOWN:
arr[1]--;
break;
default: break;
}
}
int chgdir(int dir){
if( dir == RIGHT )
dir = DOWN;
else
dir--;
return dir;
}
No comments:
Post a Comment