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));
 }

}