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