Submission #806851

#TimeUsernameProblemLanguageResultExecution timeMemory
806851oscar1fMaze (JOI23_ho_t3)C++17
100 / 100
667 ms422176 KiB
#include<bits/stdc++.h>
using namespace std;

int nbLig,nbCol,tailleMouv,ligDeb,colDeb,ligFin,colFin,dist;
vector<pair<int,int>> adja;
vector<bool> temp;
vector<string> val;
vector<vector<bool>> dv,dejaMur;
vector<pair<int,int>> frontiere,nouv,mur;
string mot;

void propage(int lig,int col,int gratos) {
    if (lig>=1 and lig<=nbLig and col>=1 and col<=nbCol and (gratos==1 or (val[lig][col]=='.' and dv[lig][col]==false))) {
        dv[lig][col]=true;
        nouv.push_back({lig,col});
        for (auto a:adja) {
            propage(lig+a.first,col+a.second,0);
        }
    }
}

void testMur(int lig,int col) {
    if (lig>=1 and lig<=nbLig and col>=1 and col<=nbCol and dv[lig][col]==false and dejaMur[lig][col]==false) {
        dejaMur[lig][col]=true;
        mur.push_back({lig,col});
    }
}

void etend(int lig,int col,int direc,int rest) {
    if (lig>=1 and lig<=nbLig and col>=1 and col<=nbCol and dv[lig][col]==false and rest>0) {
        dv[lig][col]=true;
        mur.push_back({lig,col});
        etend(lig+adja[direc].first,col+adja[direc].second,direc,rest-1);
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    adja={{-1,0},{0,1},{1,0},{0,-1}};
    cin>>nbLig>>nbCol>>tailleMouv;
    cin>>ligDeb>>colDeb>>ligFin>>colFin;
    for (int j=0;j<=nbCol+1;j++) {
        temp.push_back(false);
    }
    for (int i=0;i<=nbLig+1;i++) {
        dv.push_back(temp);
        dejaMur.push_back(temp);
    }
    val.push_back("");
    for (int i=1;i<=nbLig;i++) {
        cin>>mot;
        val.push_back(" "+mot);
    }

    propage(ligDeb,colDeb,1);
    int lig,col,nbMur;
    while (dv[ligFin][colFin]==false) {
        frontiere=nouv;
        nouv.clear();
        mur.clear();
        for (auto s:frontiere) {
            for (auto a:adja) {
                testMur(s.first+a.first,s.second+a.second);
            }
        }
        nbMur=mur.size();
        for (int i=0;i<nbMur;i++) {
            lig=mur[i].first;
            col=mur[i].second;
            etend(lig,col-1,3,tailleMouv-1);
            etend(lig,col+1,1,tailleMouv-1);
        }
        nbMur=mur.size();
        for (int i=0;i<nbMur;i++) {
            lig=mur[i].first;
            col=mur[i].second;
            etend(lig-1,col,0,tailleMouv-1);
            etend(lig+1,col,2,tailleMouv-1);
        }
        nbMur=mur.size();
        for (int i=0;i<nbMur;i++) {
            lig=mur[i].first;
            col=mur[i].second;
            propage(lig,col,1);
        }
        /*for (auto s:nouv) {
            cout<<s.first<<" "<<s.second<<endl;
        }
        cout<<endl;*/
        dist++;
    }
    cout<<dist<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...