Skip to content

Latest commit

 

History

History
111 lines (99 loc) · 2.95 KB

File metadata and controls

111 lines (99 loc) · 2.95 KB
layout
page
#include <stdio.h>

const int MAX_TIME = 1000;
int M;
typedef struct SequenceItem {
    int x;
    int y;
} SequenceItem;
typedef struct Sequence {
    int count;
    SequenceItem items[MAX_TIME + 1];
} Sequence;

const int INF = 50000;
const int BREAK = 500001;
const int LENGTH = 301;

int maxX = 0;
int maxY = 0;
int nextMaxX, nextMaxY;
int maxTime = 0;

int tmpInt;

struct Sequence sequence[MAX_TIME + 1];

int main() {
    int position[LENGTH][LENGTH];
    int x, y, time;
    int register i, j, xi, yi;
    int answer;
    answer = INF;
    maxX = 0, maxY = 0;
    for (i = 0; i < LENGTH - 1; i++)
        for (j = 0; j < LENGTH - 1; j++)
            position[i][j] = INF;
    position[0][0] = 0;

    scanf(" %d", &M);
    for (i = 0; i < M; ++i) {
        SequenceItem item;
        scanf(" %d %d %d", &item.x, &item.y, &time);
        sequence[time].items[sequence[time].count] = item;
        sequence[time].count += 1;
        if (maxTime < time) maxTime = time;
    }

    for (i = 0; i <= maxTime; ++i) {
        for (j = 0; j < sequence[i].count; j++) {
            x = sequence[i].items[j].x;
            y = sequence[i].items[j].y;
            position[x][y] = INF;
            if (x < LENGTH - 1) position[x + 1][y] = BREAK;
            if (y < LENGTH - 1) position[x][y + 1] = BREAK;
            if (0 < x) position[x - 1][y] = BREAK;
            if (0 < y) position[x][y - 1] = BREAK;
        }

        /* move */
        nextMaxX = maxX;
        nextMaxY = maxY;
        for (xi = 0; xi <= maxX; xi++) {
            for (yi = 0; yi <= maxY; yi++) {
                if (position[xi][yi] == i) {
                    tmpInt = position[xi][yi] + 1;
                    if (xi < LENGTH - 1) {
                        if (position[xi + 1][yi] == INF) {
                            position[xi + 1][yi] = tmpInt;
                            if (xi == maxX) nextMaxX = xi + 1;
                        }
                    }
                    if (xi != 0) {
                        if (position[xi - 1][yi] == INF) {
                            position[xi - 1][yi] = tmpInt;
                        }
                    }
                    if (yi < LENGTH - 1) {
                        if (position[xi][yi + 1] == INF) {
                            position[xi][yi + 1] = tmpInt;
                            if (yi == maxY) nextMaxY = yi + 1;
                        }
                    }
                    if (yi != 0) {
                        if (position[xi][yi - 1] == INF) {
                            position[xi][yi - 1] = tmpInt;
                        }
                    }
                }
            }
        }
        maxX = nextMaxX;
        maxY = nextMaxY;
    }
    for (xi = 0; xi <= maxX; xi++) {
        for (yi = 0; yi <= maxY; yi++) {
            if (answer > position[xi][yi]) {
                answer = position[xi][yi];
            }
        }
    }

    if (answer == INF) answer = -1;

    printf("%d\n", answer);
    return 0;
}