CCCPaste

Untitled


    #include 
#include 
#include 
using namespace std;

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

class ChessMaze {
public:
    int traverseMaze(vector mat) {
    memset(vis,0,sizeof vis);
    int n,m;
    
        n = mat.size();
        m = mat[0].size();
    int si,sj,ei,ej;
    int b=0;
    for(int i=0;iQ;
    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;
        }
        ///obicno pesacenje
        for(int i=0;i<4;i++)
        {
            int ti=di[i]+ci;
            int tj=dj[i]+cj;
            if(ti>=0&&ti=0&&tj=n||ti<0||tj>=m||tj<0||mat[ti][tj]=='*')
            {
                continue;
            }
            if(mat[ti][tj] == 'E') {
                return kolku + 1;
            }
            if(mat[ti][tj]=='.')
            {
                if(!vis[ti][tj][k-1][kojk])
                {
                    Q.push(ti);
                    Q.push(tj);
                    Q.push(k-1);
                    Q.push(kojk);
                    Q.push(kolku+1);
                    vis[ti][tj][k-1][kojk]=true;
                }
            }
            if(isdigit(mat[ti][tj]))
            {
                bool ok=kojk&(1<<(mat[ti][tj]-'0'));
                if(!ok)
                {
                    int nkojk=kojk|(1<<(mat[ti][tj]-'0'));
                    if(!vis[ti][tj][k][nkojk])
                    {
                        Q.push(ti);
                        Q.push(tj);
                        Q.push(k);
                        Q.push(nkojk);
                        Q.push(kolku+1);
                        vis[ti][tj][k][nkojk]=true;
                    }
                }
                else if(ok)
                {
                    if(!vis[ti][tj][k-1][kojk])
                    {
                        Q.push(ti);
                        Q.push(tj);
                        Q.push(k-1);
                        Q.push(kojk);
                        Q.push(kolku+1);
                        vis[ti][tj][k-1][kojk]=true;
                    }
                }
            }
        }
    }

    return -1;
    }
};
/*
 4 5
 ...*.
 ..***
 ...K*
 S*E**
 
 
 **/