Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<map>
- #include<vector>
- using namespace std;
- map<int,int> dp[60];
- vector<int> vm;
- vector<int> vb;
- int namesti(int m,int i,int v)
- {
- m|=(v<<(3*i));
- return m;
- }
- int najdi(int m,int i)
- {
- return ((m>>(3*i))&7);
- }
- int zavrti(int m)
- {
- return ((m)>>3);
- }
- int rek(int x,int pozi,int pocetok)
- {
- if(x==vb.size())
- {
- vector<int> v;
- for(int i=0;i<6;i++)
- {
- if(najdi(pozi,i))
- {
- if(!(pocetok&(1<<i)))
- {
- return 7;
- }
- v.push_back(najdi(pozi,i));
- }
- }
- int brojce=0;
- vector<int> visited(v.size(),0);
- for(int ii=0;ii<v.size();ii++)
- {
- if(!visited[ii])
- {
- brojce++;
- for(int i=ii;!visited[i];i=v[i]-1)
- {
- visited[i]=true;
- }
- }
- }
- return brojce;
- }
- if(dp[x].find(pozi)!=dp[x].end())
- {
- return dp[x][pozi];
- }
- if(vb[x])
- {
- if(najdi(pozi,0))
- {
- dp[x][pozi]=7;
- return dp[x][pozi];
- }
- return dp[x][pozi]=rek(x+1,zavrti(pozi),pocetok);
- }
- if(!najdi(pozi,0))
- return dp[x][pozi]=7;
- int brojace=7;
- for(int i=0;i<vm.size();i++)
- {
- if(!najdi(pozi,vm[i]))
- {
- int pp=pozi;
- pp=namesti(pp,vm[i],najdi(pozi,0));
- brojace=min(brojace,rek(x+1,zavrti(pp),pocetok));
- }
- }
- return dp[x][pozi]=brojace;
- }
- int main()
- {
- int n1;
- cin>>n1;
- for(int i=0;i<n1;i++)
- {
- int a;
- cin>>a;
- vb.push_back(a);
- }
- int n2;
- cin>>n2;
- for(int i=0;i<n2;i++)
- {
- int a;
- cin>>a;
- vm.push_back(a);
- }
- int brojac=7;
- for(int i=1;i<(1<<6);i++)
- {
- int pp=0;
- int broj=1;
- for(int j=0;j<6;j++)
- {
- if(i&(1<<j))
- {
- pp=namesti(pp,j,broj);
- broj++;
- }
- }
- brojac=min(brojac,rek(0,pp,i));
- }
- if(brojac<7)
- cout<<brojac<<endl;
- else
- cout<<"GRESHKA"<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement