Advertisement
iletavcioski

Igra

Mar 26th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include<iostream>
  2. #include<map>
  3. #include<vector>
  4. using namespace std;
  5. map<int,int> dp[60];
  6. vector<int> vm;
  7. vector<int> vb;
  8. int namesti(int m,int i,int v)
  9. {
  10.     m|=(v<<(3*i));
  11.     return m;
  12. }
  13. int najdi(int m,int i)
  14. {
  15.     return  ((m>>(3*i))&7);
  16. }
  17. int zavrti(int m)
  18. {
  19.     return  ((m)>>3);
  20. }
  21. int rek(int x,int pozi,int pocetok)
  22. {
  23.     if(x==vb.size())
  24.     {
  25.         vector<int> v;
  26.         for(int i=0;i<6;i++)
  27.         {
  28.             if(najdi(pozi,i))
  29.             {
  30.                 if(!(pocetok&(1<<i)))
  31.                 {
  32.                     return 7;
  33.                 }
  34.                 v.push_back(najdi(pozi,i));
  35.             }
  36.         }
  37.         int brojce=0;
  38.         vector<int> visited(v.size(),0);
  39.         for(int ii=0;ii<v.size();ii++)
  40.         {
  41.             if(!visited[ii])
  42.             {
  43.                 brojce++;
  44.                 for(int i=ii;!visited[i];i=v[i]-1)
  45.                 {
  46.                     visited[i]=true;
  47.                 }
  48.             }
  49.         }
  50.         return brojce;
  51.     }
  52.     if(dp[x].find(pozi)!=dp[x].end())
  53.     {
  54.         return dp[x][pozi];
  55.     }
  56.     if(vb[x])
  57.     {
  58.         if(najdi(pozi,0))
  59.         {
  60.             dp[x][pozi]=7;
  61.             return dp[x][pozi];
  62.         }
  63.         return dp[x][pozi]=rek(x+1,zavrti(pozi),pocetok);
  64.     }
  65.     if(!najdi(pozi,0))
  66.         return dp[x][pozi]=7;
  67.  
  68.     int brojace=7;
  69.     for(int i=0;i<vm.size();i++)
  70.     {
  71.         if(!najdi(pozi,vm[i]))
  72.         {
  73.             int pp=pozi;
  74.             pp=namesti(pp,vm[i],najdi(pozi,0));
  75.             brojace=min(brojace,rek(x+1,zavrti(pp),pocetok));
  76.         }
  77.     }
  78.     return dp[x][pozi]=brojace;
  79. }
  80. int main()
  81. {
  82.     int n1;
  83.     cin>>n1;
  84.     for(int i=0;i<n1;i++)
  85.     {
  86.         int a;
  87.         cin>>a;
  88.         vb.push_back(a);
  89.     }
  90.     int n2;
  91.     cin>>n2;
  92.     for(int i=0;i<n2;i++)
  93.     {
  94.         int a;
  95.         cin>>a;
  96.         vm.push_back(a);
  97.     }
  98.     int brojac=7;
  99.     for(int  i=1;i<(1<<6);i++)
  100.     {
  101.         int pp=0;
  102.         int broj=1;
  103.         for(int j=0;j<6;j++)
  104.         {
  105.             if(i&(1<<j))
  106.             {
  107.                 pp=namesti(pp,j,broj);
  108.                 broj++;
  109.             }
  110.         }
  111.         brojac=min(brojac,rek(0,pp,i));
  112.     }
  113.     if(brojac<7)
  114.         cout<<brojac<<endl;
  115.     else
  116.         cout<<"GRESHKA"<<endl;
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement