Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.7 kB
17
Indexable
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define int ll 
#define set set<int>
#define uset unordered_set<int> 
#define veci vector<int> 
#define vecs vector<string>
#define stack stack<int> 
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define all(x) (x).begin(), (x).end() 
#define FOR(s,n) for(int i = s; i < n; i++)

template<typename T> 
ostream& operator<<(ostream& COUT, vector<T>& v){ for(int i=0 ; i<v.size() ; i++){ COUT<<v[i]<<" "; } COUT << endl; return COUT; }
template<typename T> 
istream& operator>>(istream& CIN, vector<T>& a){ for(int i=0 ; i<a.size() ; i++) CIN>>a[i]; return CIN; }
template<typename T> 
void pws(const T& arg){ cout << arg <<endl;}
template <typename T, typename... Args>
void pws(const T& first, const Args&... args) {cout << first << " ";pws(args...);}

int dir[8][2] = {{0,1},{1,0},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
int MOD = 1e9 + 7;
int n,m,k;

void solve(){

    string s;

    for(int i=0;i<9;i++){
         int x;
         cin>>x;
         s+=(char)(x+'0');
    }

    string target = "123456789";

    queue<pair<string,int>> q;

    // source is s

    q.push({s,0});

    unordered_map<string,int> vis; // 9! = 3,62,880 possible state of cube possible 

    vis[s] = 1;


    while(!q.empty()){

        auto [str,d] = q.front();q.pop();

        if(str==target) {
            cout<<d<<endl;
            break;
        }

         string temp = str;


         // for horizontal swap possiblity 

        for(int i=0;i<2;i++){

           swap(temp[i],temp[i+1]);

           if(!vis[temp]){
            vis[temp] = 1;
            q.push({temp,d+1});
           }
           
           swap(temp[i],temp[i+1]);

        }

         for(int i=3;i<5;i++){

           swap(temp[i],temp[i+1]);

           if(!vis[temp]){
            vis[temp] = 1;
            q.push({temp,d+1});
           }
           
           swap(temp[i],temp[i+1]);

        }

        for(int i=6;i<9;i++){

           swap(temp[i],temp[i+1]);

           if(!vis[temp]){
            vis[temp] = 1;
            q.push({temp,d+1});
           }
           
           swap(temp[i],temp[i+1]);

        }

        // for veritical swap possiblity 

        for(int i=0;i<6;i++){

            swap(temp[i],temp[i+3]);

          if(!vis[temp]){
            vis[temp] = 1;
            q.push({temp,d+1});
           }
           
           swap(temp[i],temp[i+3]);


        }
    }
       
        
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);   
    int t=1;
    // cin>>t;
    while(t--) solve();
}