답안 #68270

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
68270 2018-08-16T10:46:29 Z AdrienVannson Cultivation (JOI17_cultivation) C++14
5 / 100
2000 ms 20788 KB
// Sous-tâche 1 & 2

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <array>

using namespace std;

const int oo = 1000*1000*1000;
const int INCONNU = -1;

const int TAILLE_MAX = 40;
const int NB_MAX_LIGNES = TAILLE_MAX;
const int NB_MAX_COLONNES = TAILLE_MAX;

const int NB_DIRECTIONS = 4;
const int DELTAS_DIRECTIONS[NB_DIRECTIONS][2] = {
    {0, 1},
    {1, 0},
    {0, -1},
    {-1, 0}
};

int nbLignes, nbColonnes;


int dynamique[TAILLE_MAX][TAILLE_MAX][TAILLE_MAX][TAILLE_MAX];

int getNbActionsMin (const array<array<bool, NB_MAX_COLONNES>, NB_MAX_LIGNES> &estPlein, const array<int, NB_DIRECTIONS> &nbUtilisations)
{
    int &res = dynamique[ nbUtilisations[0] ][ nbUtilisations[1] ][ nbUtilisations[2] ][ nbUtilisations[3] ];

    if (res != INCONNU) {
        return res;
    }

    bool estValide = true;

    for (int iLigne=0; iLigne<nbLignes; iLigne++) {
        for (int iColonne=0; iColonne<nbColonnes; iColonne++) {
            if (!estPlein[iLigne][iColonne]) {
                estValide = false;
            }
        }
    }

    if (estValide) {
        return res = 0;
    }


    res = +oo;

    for (int iDirection=0; iDirection<NB_DIRECTIONS; iDirection++) {
        auto nouveauEstPlein = estPlein;

        for (int iLigne=0; iLigne<nbLignes; iLigne++) {
            for (int iColonne=0; iColonne<nbColonnes; iColonne++) {

                if (!estPlein[iLigne][iColonne]) {
                    continue;
                }

                const int iNouvelleLigne = iLigne + DELTAS_DIRECTIONS[iDirection][0];
                const int iNouvelleColonne = iColonne + DELTAS_DIRECTIONS[iDirection][1];

                if (iNouvelleLigne < 0 || iNouvelleLigne >= nbLignes || iNouvelleColonne < 0 || iNouvelleColonne >= nbColonnes) {
                    continue;
                }

                nouveauEstPlein[iNouvelleLigne][iNouvelleColonne] = true;
            }
        }

        if (nouveauEstPlein != estPlein) {
            auto nouveauNbUtilisations = nbUtilisations;
            nouveauNbUtilisations[iDirection]++;

            res = min(getNbActionsMin(nouveauEstPlein, nouveauNbUtilisations) + 1, res);
        }
    }

    return res;
}


int main ()
{
    fill(***dynamique, ***dynamique+TAILLE_MAX*TAILLE_MAX*TAILLE_MAX*TAILLE_MAX, INCONNU);

    scanf("%d %d", &nbLignes, &nbColonnes);

    if (nbLignes > NB_MAX_LIGNES || nbColonnes > NB_MAX_COLONNES) {
        printf("%d\n", 1/0);
        return 0;
    }

    array<array<bool, NB_MAX_COLONNES>, NB_MAX_LIGNES> estPlein;

    for (int iLigne=0; iLigne<nbLignes; iLigne++) {
        for (int iColonne=0; iColonne<nbColonnes; iColonne++) {
            estPlein[iLigne][iColonne] = false;
        }
    }

    int nbCellulesPleines;
    scanf("%d", &nbCellulesPleines);

    for (int iCellule=0; iCellule<nbCellulesPleines; iCellule++) {
        int iLigne, iColonne;
        scanf("%d %d", &iLigne, &iColonne);
        iLigne--, iColonne--;

        estPlein[iLigne][iColonne] = true;
    }

    printf("%d\n", getNbActionsMin(estPlein, {0, 0, 0, 0}));

    return 0;
}

Compilation message

cultivation.cpp: In function 'int main()':
cultivation.cpp:95:25: warning: division by zero [-Wdiv-by-zero]
         printf("%d\n", 1/0);
                        ~^~
cultivation.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &nbLignes, &nbColonnes);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cultivation.cpp:108:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &nbCellulesPleines);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
cultivation.cpp:112:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &iLigne, &iColonne);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 10360 KB Output is correct
2 Correct 10 ms 10468 KB Output is correct
3 Correct 10 ms 10468 KB Output is correct
4 Correct 10 ms 10588 KB Output is correct
5 Correct 10 ms 10588 KB Output is correct
6 Correct 10 ms 10588 KB Output is correct
7 Correct 10 ms 10596 KB Output is correct
8 Correct 10 ms 10600 KB Output is correct
9 Correct 11 ms 10600 KB Output is correct
10 Correct 10 ms 10600 KB Output is correct
11 Correct 10 ms 10600 KB Output is correct
12 Correct 12 ms 10600 KB Output is correct
13 Correct 12 ms 10600 KB Output is correct
14 Correct 11 ms 10600 KB Output is correct
15 Correct 11 ms 10600 KB Output is correct
16 Correct 11 ms 10600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 10360 KB Output is correct
2 Correct 10 ms 10468 KB Output is correct
3 Correct 10 ms 10468 KB Output is correct
4 Correct 10 ms 10588 KB Output is correct
5 Correct 10 ms 10588 KB Output is correct
6 Correct 10 ms 10588 KB Output is correct
7 Correct 10 ms 10596 KB Output is correct
8 Correct 10 ms 10600 KB Output is correct
9 Correct 11 ms 10600 KB Output is correct
10 Correct 10 ms 10600 KB Output is correct
11 Correct 10 ms 10600 KB Output is correct
12 Correct 12 ms 10600 KB Output is correct
13 Correct 12 ms 10600 KB Output is correct
14 Correct 11 ms 10600 KB Output is correct
15 Correct 11 ms 10600 KB Output is correct
16 Correct 11 ms 10600 KB Output is correct
17 Correct 51 ms 10600 KB Output is correct
18 Correct 279 ms 10980 KB Output is correct
19 Execution timed out 2045 ms 10980 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 10360 KB Output is correct
2 Correct 10 ms 10468 KB Output is correct
3 Correct 10 ms 10468 KB Output is correct
4 Correct 10 ms 10588 KB Output is correct
5 Correct 10 ms 10588 KB Output is correct
6 Correct 10 ms 10588 KB Output is correct
7 Correct 10 ms 10596 KB Output is correct
8 Correct 10 ms 10600 KB Output is correct
9 Correct 11 ms 10600 KB Output is correct
10 Correct 10 ms 10600 KB Output is correct
11 Correct 10 ms 10600 KB Output is correct
12 Correct 12 ms 10600 KB Output is correct
13 Correct 12 ms 10600 KB Output is correct
14 Correct 11 ms 10600 KB Output is correct
15 Correct 11 ms 10600 KB Output is correct
16 Correct 11 ms 10600 KB Output is correct
17 Correct 51 ms 10600 KB Output is correct
18 Correct 279 ms 10980 KB Output is correct
19 Execution timed out 2045 ms 10980 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 20 ms 20788 KB Execution killed with signal 4 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 20 ms 20788 KB Execution killed with signal 4 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 10360 KB Output is correct
2 Correct 10 ms 10468 KB Output is correct
3 Correct 10 ms 10468 KB Output is correct
4 Correct 10 ms 10588 KB Output is correct
5 Correct 10 ms 10588 KB Output is correct
6 Correct 10 ms 10588 KB Output is correct
7 Correct 10 ms 10596 KB Output is correct
8 Correct 10 ms 10600 KB Output is correct
9 Correct 11 ms 10600 KB Output is correct
10 Correct 10 ms 10600 KB Output is correct
11 Correct 10 ms 10600 KB Output is correct
12 Correct 12 ms 10600 KB Output is correct
13 Correct 12 ms 10600 KB Output is correct
14 Correct 11 ms 10600 KB Output is correct
15 Correct 11 ms 10600 KB Output is correct
16 Correct 11 ms 10600 KB Output is correct
17 Correct 51 ms 10600 KB Output is correct
18 Correct 279 ms 10980 KB Output is correct
19 Execution timed out 2045 ms 10980 KB Time limit exceeded
20 Halted 0 ms 0 KB -