Advertisement
kburnik

C++ - Zadatak Othello - rješenje

Mar 14th, 2013
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. /*
  2.  Zadatak: Othello, Infokup 2012, 7.r. državno
  3.  
  4.  Ponuđeno rješenje: Kristijan Burnik
  5.  
  6.  Posebna zahvala na pomoći: Dominik Fistrić
  7.  
  8. */
  9. #include <iostream>
  10. #include <cstdlib>
  11. #include <vector>
  12.  
  13. using namespace std;
  14.  
  15.  
  16. const int R = 8, S = 8;
  17. const int X = 1;
  18. const int O = 2;
  19.  
  20. // kod globalnih matrica, resetira se sve u nulu
  21. int ploca[R][S];
  22.  
  23. int n;
  24. int okrenutih = 0;
  25.  
  26. // sva zatvaranja (zrake oko trenutnog žetona)
  27. /*
  28.  
  29. D - dalji žeton {dr,ds}
  30. B - bliži žeton {br,bs}
  31. T - treutni žeton (nije naveden jer je uvijek {0,0} )
  32.  
  33. D D D
  34.  BBB
  35. DBTBD
  36.  BBB
  37. D D D
  38. */
  39.  
  40. int zatvaranja[8][2][2] = {
  41.     {{-2,-2},{-1,-1}},
  42.     {{-2,0},{-1,0}},
  43.     {{-2,2},{-1,1}},    
  44.     {{0,2},{0,1}},    
  45.     {{2,2},{1,1}},
  46.     {{2,0},{1,0}},        
  47.     {{2,-2},{1,-1}},
  48.     {{0,-2},{0,-1}},    
  49. };
  50.  
  51. void okreni(int r, int s, int igrac) {
  52.     int br,bs,dr,ds;
  53.    
  54.     for (int k = 0; k < 8; k++) {
  55.         // pozicija blizeg
  56.         br=zatvaranja[k][1][0];
  57.         bs=zatvaranja[k][1][1];
  58.  
  59.         // pozicija daljeg
  60.         dr=zatvaranja[k][0][0];
  61.         ds=zatvaranja[k][0][1];
  62.  
  63.         // izvan matrice
  64.         if ( (r+br) >= R || (r+br) < 0 || (s+bs) >= S || (s+bs) < 0 )  
  65.             continue; // preskoci ovaj korak petlje
  66.  
  67.            
  68.         int trenutni = ploca[r][s];
  69.         int blizi = ploca[r+br][s+bs];
  70.         int dalji = ploca[r+dr][s+ds];                
  71.        
  72.         // prazno polje, preskoci
  73.         if (blizi == 0 || dalji == 0)
  74.             continue;
  75.  
  76.        
  77.         if (dalji != blizi && blizi != trenutni ) {
  78.             // okreni
  79.             ploca[r+br][s+bs] = igrac;  
  80.             // pribroji
  81.             okrenutih++;
  82.         }
  83.     }
  84. }
  85.  
  86. int main() {
  87.     cin >> n;
  88.    
  89.     int r,s;
  90.     int igrac = X;
  91.    
  92.     // postavi pocetne zetone
  93.     ploca[3][3] = ploca[4][4] = X;
  94.     ploca[3][4] = ploca[4][3] = O;    
  95.    
  96.     for (int i = 0 ; i < n ; i++) {
  97.         cin >> r >> s;
  98.         r--; s--;
  99.  
  100.         // postavi zeton
  101.         ploca[r][s] = igrac;
  102.        
  103.         // okreni ako treba i broji okrete
  104.         okreni(r,s,igrac);
  105.        
  106.         // promjeni igraca
  107.         igrac = (X+O) - igrac;
  108.     }
  109.  
  110.     // ispisi kolko je bilo okrenutih
  111.     cout << okrenutih << endl;
  112.    
  113.     system("pause");
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement