Submission #894530

#TimeUsernameProblemLanguageResultExecution timeMemory
894530heeheeheehaawRiddick's Cube (IZhO13_riddicks)C++17
100 / 100
61 ms440 KiB
#include <bits/stdc++.h>

using namespace std;

int a[8][8];
int v[8][8];
int init[8][8];
int curr[8][8];
int aux[8][8];
int rez = 100500;
vector<int> moves;
int n, m;

void colsus(int j)
{
    for(int i = 2; i <= n; i++)
        swap(v[i - 1][j], v[i][j]);
}

void coljos(int j)
{
    for(int i = n - 1; i >= 1; i--)
        swap(v[i][j], v[i + 1][j]);
}

void linst(int i)
{
    for(int j = 2; j <= m; j++)
        swap(v[i][j], v[i][j - 1]);
}

void lindr(int i)
{
    for(int j = m - 1; j >= 1; j--)
        swap(v[i][j], v[i][j + 1]);
}

void linauxdr(int i)
{
    for(int j = m - 1; j >= 1; j--)
        swap(aux[i][j], aux[i][j + 1]);
}

void linauxst(int i)
{
    for(int j = 2; j <= m; j++)
        swap(aux[i][j], aux[i][j - 1]);
}

void solve()
{
    bool ok = false;
    int ans = 0, fin = 1e9;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            v[i][j] = a[i][j];

    for(int i = 1; i <= m; i++)
    {
        int nr = moves[i - 1];
        ans += abs(nr);
        while(nr < 0) colsus(i), nr++;
        while(nr > 0) coljos(i), nr--;
    }

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            init[i][j] = v[i][j];

    for(int nr = 0; nr < m; nr++)
    {
        bool ver = true;
        for(int i = 2; i <= n; i++)
        {
            bool altcv = false;
            for(int j = 0; j < m; j++)
            {
                bool sper = true;
                for(int k = 1; k <= m; k++)
                    if(v[i][k] != v[1][k])
                        sper = false;
                if(sper == true)
                    altcv = true;
                lindr(i);
            }

            if(altcv == false)
                ver = false;
        }

        if(ver == true)
        {
            int sper = ans;
            ok = true;
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= m; j++)
                    aux[i][j] = init[i][j];

            for(int i = 1; i <= n; i++)
            {
                int minn = 5;
                for(int cnt = 0; cnt < m; cnt++)
                {
                    bool ver = true;
                    for(int j = 1; j <= m; j++)
                        if(aux[i][j] != v[1][j])
                            ver = false;
                    if(ver) minn = min(minn, cnt);
                    linauxdr(i);
                }

                for(int cnt = 0; cnt < m; cnt++)
                {
                    bool ver = true;
                    for(int j = 1; j <= m; j++)
                        if(aux[i][j] != v[1][j])
                            ver = false;
                    if(ver) minn = min(minn, cnt);
                    linauxst(i);
                }

                sper += minn;
            }

            rez = min(rez, sper);
        }

        lindr(1);
    }

    return;
}

void backt(int poz)
{
    if(poz > m)
    {
        solve();
        return;
    }

    for(int i = -4; i <= 4; i++)
    {
        moves.push_back(i);
        backt(poz + 1);
        moves.pop_back();
    }
}

int main()
{
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin>>a[i][j];
    backt(1);
    cout<<rez;
    return 0;
}

Compilation message (stderr)

riddicks.cpp: In function 'void solve()':
riddicks.cpp:52:10: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
   52 |     bool ok = false;
      |          ^~
riddicks.cpp:53:18: warning: unused variable 'fin' [-Wunused-variable]
   53 |     int ans = 0, fin = 1e9;
      |                  ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...