http://acm.pku.edu.cn/JudgeOnline/problem?id=1216
Код:
#include <stdio.h> #include<stdlib.h> #define MAX 101 typedef struct obj { int val,cost; } obType; obType *board[MAX][MAX]; int maxX,maxY; int wallCost; void InitBoard(void); int DoBall(int, int, int, int); int main() { int bx,by,dir,life; int s,ts; InitBoard(); ts = 0; while (scanf("%d %d %d %d",&bx,&by,&dir,&life) != EOF){ s = DoBall(bx,by,dir,life); ts += s; printf("%d\n",s); } printf("%d\n",ts); } void step(int dir,int x, int y, int *nx, int *ny) { *nx = x; *ny = y; switch (dir){ case 0: *nx = x + 1; break; case 1: *ny = y + 1; break; case 2: *nx = x - 1; break; case 3: *ny = y - 1; break; } } int nextDir(int dir) { if (dir == 0) return 3; else return dir - 1; } int DoBall(int x, int y, int dir, int life) { int nx,ny,s = 0; while (life > 1){ step(dir,x,y,&nx,&ny); life--; if (board[nx][ny]){ dir = nextDir(dir); s += board[nx][ny]->val; life -= board[nx][ny]->cost; } else if (nx == 1 || nx == maxX){ life -= wallCost; dir = nextDir(dir); } else if (ny == 1 || ny == maxY){ life -= wallCost; dir = nextDir(dir); } else{ x = nx; y = ny; } } return s; } void InitBoard() { int i,j,nobjs; scanf("%d %d",&maxX,&maxY); for(i=0;i<MAX;i++) for(j=0;j<MAX;j++) board[i][j] = (obType *) NULL; scanf("%d",&wallCost); scanf("%d",&nobjs); for(;nobjs > 0;nobjs--){ scanf("%d %d",&i,&j); board[i][j] = (obType *) malloc(sizeof(obType)); scanf("%d %d",&(board[i][j]->val),&(board[i][j]->cost)); } }