Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************
- * BISMILLAHIR RAHMANIR RAHIM *
- * Saddam Hossain shishir *
- * Hajee Mohammad Danesh Science & Technology University *
- * *
- ***************************************************************** */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<map>
- #include<string>
- #include<set>
- #include<cmath>
- #include<cctype>
- #include<stack>
- #include<cstdlib>
- #include<utility>
- #include<vector>
- #include<deque>
- #include<queue>
- #include<algorithm>
- #define sc scanf
- #define si(t) scanf("%d",&t)
- #define sl(t) scanf("%I64d",&t)
- #define sii(a,b) scanf("%d%d",&a,&b)
- #define P(a) printf("%d\n",a)
- #define PLN(a) printf("%I64d ",a)
- #define pf printf
- #define gcd(a,b) __gcd(a,b)
- #define ff first
- #define ss second
- #define pr1(a) cout<<a<<endl
- #define pr2(a,b) cout<<a<<" "<<b<<endl
- #define pb push_back
- #define pii pair<int,int>
- #define mk make_pair
- #define pi acos(-1.0)
- #define PI 3.1415926535897932385
- #define Sin(a) sin((pi*a)/180)
- #define siz 1000001
- #define mem(ar) memset(ar,0,sizeof ar)
- #define one(x) __builtin_popcount(x)
- typedef long long ll;
- using namespace std;
- //int dx[]= {-1,-1,0,0,1,1};
- //int dy[]= {-1,0,-1,1,0,1};
- int dx[]= {0,0,1,-1};/*4 side move*/
- int dy[]= {-1,1,0,0};/*4 side move*/
- //int dx[]= {1,1,0,-1,-1,-1,0,1};/*8 side move*/
- //int dy[]= {0,1,1,1,0,-1,-1,-1};/*8 side move*/
- //int dx[]={1,1,2,2,-1,-1,-2,-2};/*knight move*/
- //int dy[]={2,-2,1,-1,2,-2,1,-1};/*knight move*/
- //'A'=65, 'a'=97 '0'=48
- map<ll,bool>visi;
- int ar[siz];
- int Set(int N,int pos)
- {
- return N=N | (1<<pos);
- }
- int reset(int N,int pos)
- {
- return N= N & ~(1<<pos);
- }
- bool check(int N,int pos)
- {
- return (bool)(N & (1<<pos));
- }
- map<vector<int>,int>vis,dis;
- vector<int>vec,vec2,vec3,vec4,vec5,vec6,indicate,indicate2,puzzle;
- int answer=0;
- struct node
- {
- vector<int>vec,vec2,vec3;
- } vect;
- int merge_(vector<int>vec,vector<int>vec2,vector<int>vec3)
- {
- indicate.clear();
- int i;
- for(i=0; i<3; i++)
- indicate.pb(vec[i]);
- for(i=0; i<3; i++)
- indicate.pb(vec2[i]);
- for(i=0; i<3; i++)
- indicate.pb(vec3[i]);
- }
- void prinn(vector<int>vec,vector<int>vec2,vector<int>vec3)
- {
- for(int i=0; i<3; i++)
- cout<<vec[i]<<" ";
- cout<<endl;
- for(int i=0; i<3; i++)
- cout<<vec2[i]<<" ";
- cout<<endl;
- for(int i=0; i<3; i++)
- cout<<vec3[i]<<" ";
- cout<<endl<<endl;
- }
- int bfs()
- {
- queue<node>qe;
- vect.vec=vec,vect.vec2=vec2,vect.vec3=vec3;
- qe.push(vect);
- merge_(vec,vec2,vec3);
- vis[indicate]=1;
- dis[indicate]=0;
- int row,col,x,y,z,a,b,c;
- while(!qe.empty())
- {
- node vett=qe.front();
- qe.pop();
- vec=vett.vec;
- vec2=vett.vec2;
- vec3=vett.vec3;
- vec4=vec,vec5=vec2,vec6=vec3;
- merge_(vec4,vec5,vec6);
- indicate2=indicate;
- if(dis[puzzle]) return dis[puzzle];
- for(int i=0; i<3; i++)
- {
- if(vec[i]==0)
- {
- row=0;
- col=i;
- break;
- }
- }
- for(int i=0; i<3; i++)
- {
- if(vec2[i]==0)
- {
- row=1;
- col=i;
- break;
- }
- }
- for(int i=0; i<3; i++)
- {
- if(vec3[i]==0)
- {
- row=2;
- col=i;
- break;
- }
- }
- for(int i=0; i<4; i++)
- {
- int row1=row+dx[i];
- int col1=col+dy[i];
- if(row1>=0&&row1<=2&&col1>=0&&col1<=2)
- {
- if(row==0)
- {
- x=vec[0];
- y=vec[1];
- z=vec[2];
- if(i==0)
- {
- vec4.clear();
- vec5=vec2;
- vec6=vec3;
- if(col==2)
- {
- vec4.pb(x);
- vec4.pb(z);
- vec4.pb(y);
- }
- else if(col==1)
- {
- vec4.pb(y);
- vec4.pb(x);
- vec4.pb(z);
- }
- }
- else if(i==1)
- {
- vec4.clear();
- vec5=vec2;
- vec6=vec3;
- if(col==0)
- {
- vec4.pb(y);
- vec4.pb(x);
- vec4.pb(z);
- }
- else if(col==1)
- {
- vec4.pb(x);
- vec4.pb(z);
- vec4.pb(y);
- }
- }
- else if(i==2)
- {
- vec5.clear();
- vec4.clear();
- vec6=vec3;
- a=vec2[0];
- b=vec2[1];
- c=vec2[2];
- if(col==0)
- {
- vec4.pb(a);
- vec4.pb(y);
- vec4.pb(z);
- vec5.pb(x);
- vec5.pb(b);
- vec5.pb(c);
- }
- else if(col==1)
- {
- vec4.pb(x);
- vec4.pb(b);
- vec4.pb(z);
- vec5.pb(a);
- vec5.pb(y);
- vec5.pb(c);
- }
- else if(col==2)
- {
- vec4.pb(x);
- vec4.pb(y);
- vec4.pb(c);
- vec5.pb(a);
- vec5.pb(b);
- vec5.pb(z);
- }
- }
- }
- else if(row==1)
- {
- x=vec2[0];
- y=vec2[1];
- z=vec2[2];
- if(i==0)
- {
- vec5.clear();
- vec4=vec;
- vec6=vec3;
- if(col==2)
- {
- vec5.pb(x);
- vec5.pb(z);
- vec5.pb(y);
- }
- else if(col==1)
- {
- vec5.pb(y);
- vec5.pb(x);
- vec5.pb(z);
- }
- }
- else if(i==1)
- {
- vec5.clear();
- vec4=vec;
- vec6=vec3;
- if(col==0)
- {
- vec5.pb(y);
- vec5.pb(x);
- vec5.pb(z);
- }
- else if(col==1)
- {
- vec5.pb(x);
- vec5.pb(z);
- vec5.pb(y);
- }
- }
- else if(i==2)
- {
- vec5.clear();
- vec6.clear();
- vec4=vec;
- a=vec3[0];
- b=vec3[1];
- c=vec3[2];
- if(col==0)
- {
- vec5.pb(a);
- vec5.pb(y);
- vec5.pb(z);
- vec6.pb(x);
- vec6.pb(b);
- vec6.pb(c);
- }
- else if(col==1)
- {
- vec5.pb(x);
- vec5.pb(b);
- vec5.pb(z);
- vec6.pb(a);
- vec6.pb(y);
- vec6.pb(c);
- }
- else if(col==2)
- {
- vec5.pb(x);
- vec5.pb(y);
- vec5.pb(c);
- vec6.pb(a);
- vec6.pb(b);
- vec6.pb(z);
- }
- }
- else if(i==3)
- {
- vec4.clear();
- vec5.clear();
- vec6=vec3;
- a=vec[0];
- b=vec[1];
- c=vec[2];
- if(col==0)
- {
- vec4.pb(x);
- vec4.pb(b);
- vec4.pb(c);
- vec5.pb(a);
- vec5.pb(y);
- vec5.pb(z);
- }
- else if(col==1)
- {
- vec4.pb(a);
- vec4.pb(y);
- vec4.pb(c);
- vec5.pb(x);
- vec5.pb(b);
- vec5.pb(z);
- }
- else if(col==2)
- {
- vec5.pb(x);
- vec5.pb(y);
- vec5.pb(c);
- vec4.pb(a);
- vec4.pb(b);
- vec4.pb(z);
- }
- }
- }
- else if(row==2)
- {
- x=vec3[0];
- y=vec3[1];
- z=vec3[2];
- if(i==0)
- {
- vec6.clear();
- vec4=vec;
- vec5=vec2;
- if(col==2)
- {
- vec6.pb(x);
- vec6.pb(z);
- vec6.pb(y);
- }
- else if(col==1)
- {
- vec6.pb(y);
- vec6.pb(x);
- vec6.pb(z);
- }
- }
- else if(i==1)
- {
- vec6.clear();
- vec5=vec2;
- vec4=vec;
- if(col==0)
- {
- vec6.pb(y);
- vec6.pb(x);
- vec6.pb(z);
- }
- else if(col==1)
- {
- vec6.pb(x);
- vec6.pb(z);
- vec6.pb(y);
- }
- }
- else if(i==3)
- {
- vec6.clear();
- vec5.clear();
- vec4=vec;
- a=vec2[0];
- b=vec2[1];
- c=vec2[2];
- if(col==0)
- {
- vec5.pb(x);
- vec5.pb(b);
- vec5.pb(c);
- vec6.pb(a);
- vec6.pb(y);
- vec6.pb(z);
- }
- else if(col==1)
- {
- vec5.pb(a);
- vec5.pb(y);
- vec5.pb(c);
- vec6.pb(x);
- vec6.pb(b);
- vec6.pb(z);
- }
- else if(col==2)
- {
- vec5.pb(a);
- vec5.pb(b);
- vec5.pb(z);
- vec6.pb(x);
- vec6.pb(y);
- vec6.pb(c);
- }
- }
- }
- indicate.clear();
- merge_(vec4,vec5,vec6);
- if(vis[indicate]==0)
- {
- answer++;
- // cout<<"i=="<<i<<endl;
- // prinn(vec4,vec5,vec6);
- vett.vec=vec4,vett.vec2=vec5,vett.vec3=vec6;
- qe.push(vett);
- vis[indicate]=1;
- dis[indicate]=dis[indicate2]+1;
- }
- }
- }
- }
- return -1;
- }
- void set_puzzle()
- {
- int i,a=1;
- for(i=0; i<8; i++)
- puzzle.pb(a++);
- puzzle.pb(0);
- // for(i=0;i<9;i++) cout<<puzzle[i]<<" ";
- }
- int main()
- {
- //freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- int i,j,n,m,a,c,b,d,ck,t,r,x,y,ans,rem,cnt,lo,hi,sum,row,col,cs=1;
- set_puzzle();
- cout<<"Enter the random 8 puzzle..\n";
- for(i=0; i<3; i++)
- {
- si(x);
- vec.pb(x);
- }
- for(i=0; i<3; i++)
- {
- si(x);
- vec2.pb(x);
- }
- for(i=0; i<3; i++)
- {
- si(x);
- vec3.pb(x);
- }
- ans=bfs();
- if(ans==-1)
- cout<<"Impossible to solve\n";
- else
- cout<<"minimum move to solve:"<<ans<<endl;
- }
- /*
- goal:
- 1 2 3
- 4 5 6
- 7 8 0
- input:
- 1 3 2
- 4 6 5
- 7 8 0
- output: minimum moves to solve: 18
- input:
- 1 2 3
- 4 5 6
- 7 0 8
- output: minimum moves to solve: 1
- input:
- 1 2 3
- 4 5 6
- 8 7 0
- output: Impossible to solve\n
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement