CCCPaste

Untitled

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
char mat[105][105];
bool visited[105][105][1 << 8];
int main()
{
    int n, m;
    cin >> n >> m;
    int si, sj;
    int ei, ej;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cin >> mat[i][j];
            if(mat[i][j] == 'P') { // pocetok
                si = i;
                sj = j;
            }
            if(mat[i][j] == 'K') {
                ei = i;
                ej = j;
            }
        }
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            for(int mask = 0; mask < (1 << 8); mask++) {
                visited[i][j][mask] = false;
            }
        }
    }
    queue q;
    q.push(si);
    q.push(sj);
    q.push(0); // koi klucevi do sega sme gi zemale
    q.push(0); // kolku cekori do tuka sme pominale
    visited[si][sj][0] = true;
    int di[] = {-1, 1, 0, 0};
    int dj[] = {0, 0, -1, 1};
    while(!q.empty()) {
        int ci = q.front();
        q.pop();
        int cj = q.front();
        q.pop();
        int bitmask = q.front();
        q.pop();
        int cekor = q.front();
        q.pop();
        if(mat[ci][cj] == 'K') {
            cout << cekor << endl;
            return 0;
        }
        for(int i = 0; i < 4; i++) {
            int ti = ci + di[i];
            int tj = cj + dj[i];
            if(ti >= 0 and ti < n and tj >= 0 and tj < m and mat[ti][tj] != '#') {
                if(mat[ti][tj] >= 'a' and mat[ti][tj] <= 'h') {
                    int bukva = mat[ti][tj] - 'a';
                    int zemeno = bitmask | (1 << bukva);
                    if(!visited[ti][tj][zemeno]) {
                        visited[ti][tj][zemeno] = true;
                        q.push(ti);
                        q.push(tj);
                        q.push(zemeno);
                        q.push(cekor + 1);
                    }
                }
                else if(mat[ti][tj] >= 'A' and mat[ti][tj] <= 'H') {
                    int bukva = mat[ti][tj] - 'A';
                    if(bitmask & (1 << bukva)) {
                        if(!visited[ti][tj][bitmask]) {
                            q.push(ti);
                            q.push(tj);
                            q.push(bitmask);
                            q.push(cekor + 1);
                            visited[ti][tj][bitmask] = true;
                        }
                    }
                }
                else {
                    if(!visited[ti][tj][bitmask]) {
                        visited[ti][tj][bitmask] = true;
                        q.push(ti);
                        q.push(tj);
                        q.push(bitmask);
                        q.push(cekor + 1);
                    }
                }
                
            }
        }
    }
    cout << "Ne moze da se stigne do kraj" << endl;
    return 0;
}
/*

P..A
..#K
...#
a...
 
 
10 10
P.....d..f
####F#D###
..........
......h..b
.#####H###
.#....a...
.#.###A###
.#.#...c..
.#.#.####C
.B.#.#...K
 
 */