CCCPaste

Untitled


    #include 
#include 
#include 
using namespace std;

bool vis[16][16][15][(1<<10)];

int main() {
    memset(vis,0,sizeof vis);
    int n,m;
    cin >> n >> m;
    char mat[n][m];
        
       
    int si,sj,ei,ej;
    int b=0;
    for(int i=0;i> mat[i][j];
            if(mat[i][j]=='S')
            {
                si=i;
                sj=j;
            }
            if(mat[i][j]=='E')
            {
                ei=i;
                ej=j;
            }
            if(mat[i][j]=='K')
            {
                mat[i][j]= (b+'0');
                b++;
            }
        }
    }
    queueQ;
    Q.push(si);
    Q.push(sj);
    Q.push(0);///K
    Q.push(0);///kojK
    Q.push(0);///kolku
    vis[si][sj][0][0]=true;
    int di[4]={1,-1,0,0};
    int dj[4]={0,0,-1,1};
    int dik[8]={-1,-1,1,1,2,2,-2,-2};
    int djk[8]={-2,2,-2,2,-1,1,-1,1};
    while(!Q.empty())
    {
        int ci=Q.front();
        Q.pop();
        int cj=Q.front();
        Q.pop();
        int k=Q.front();
        Q.pop();
        int kojk=Q.front();
        Q.pop();
        int kolku=Q.front();
        Q.pop();
        if(ci==ei && cj==ej)
        {
            return kolku;
        }
        for(int i = 0; i < 4; i++) {
            int ti = di[i] + ci;
            int tj = dj[i] + cj;
            
            if(ti >= 0 and ti < n and tj >= 0 and tj < m and mat[ti][tj] != '*') {
                int new_k = k;
                int new_mask = kojk;
                if(isdigit(mat[ti][tj])) {
                    int d = (mat[ti][tj] - '0');
                    if(new_mask & (1 << d)) {
                        
                    }
                    else {
                        new_mask |= (1 << d);
                        new_k++;
                    }
                }
                if(!vis[ti][tj][new_k][new_mask]) {
                    Q.push(ti);
                    Q.push(tj);
                    Q.push(new_k);
                    Q.push(new_mask);
                    Q.push(kolku + 1);
                    vis[ti][tj][new_k][new_mask] = true;
                }
            }
        }
        if(k > 0) {
            for(int i =0; i < 8; i++) {
                int ti = ci + dik[i];
                int tj = cj + djk[i];
                if(ti >= 0 and ti < n and tj >= 0  and tj < m and mat[ti][tj] != '*') {
                    int new_k = k - 1;
                    int new_mask = kojk;
                    if(isdigit(mat[ti][tj])) {
                        int d = (mat[ti][tj] - '0');
                        if(new_mask & (1 << d)) {
                            
                        }
                        else {
                            new_mask |= (1 << d);
                            new_k++;
                        }
                    }
                    if(!vis[ti][tj][new_k][new_mask]) {
                        Q.push(ti);
                        Q.push(tj);
                        Q.push(new_k);
                        Q.push(new_mask);
                        Q.push(kolku + 1);
                        vis[ti][tj][new_k][new_mask] = true;                    }
                }
            }
        }
    }
    cout << -1 << endl;
    return 0;
    }

/*
 4 5
 ...*.
 ..***
 ...K*
 S*E**
 
 
 **/