Advertisement
juanjo12x

UVA_220_Othello

Aug 3rd, 2014
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.65 KB | None | 0 0
  1. /*
  2.   UVa 220 - Othello
  3.  
  4.   To build using Visual Studio 2012:
  5.     cl -EHsc -O2 UVa_220_Othello.cpp
  6. */
  7.  
  8. #include <cstdio>
  9.  
  10. const int nr_squares = 8;
  11. char board[nr_squares][nr_squares + 1];
  12.  
  13. bool is_other_disk(char disk, int r, int c)
  14. {
  15.   if (r < 0 || r >= nr_squares || c < 0 || c >= nr_squares)
  16.     return false;
  17.   return board[r][c] != '-' && disk != board[r][c];
  18. }
  19.  
  20. bool is_leagal_move(char disk, int r, int c)
  21. {
  22.   if (is_other_disk(disk, r - 1, c)) // above squares
  23.     for (int i = r - 2; i >= 0; i--) {
  24.       if (board[i][c] == disk)
  25.         return true;
  26.       else if (board[i][c] == '-')
  27.         break;
  28.     }
  29.   if (is_other_disk(disk, r + 1, c)) // below squares
  30.     for (int i = r + 2; i < nr_squares; i++) {
  31.       if (board[i][c] == disk)
  32.         return true;
  33.       else if (board[i][c] == '-')
  34.         break;
  35.     }
  36.   if (is_other_disk(disk, r, c - 1)) // left squares
  37.     for (int j = c - 2; j >= 0; j--) {
  38.       if (board[r][j] == disk)
  39.         return true;
  40.       else if (board[r][j] == '-')
  41.         break;
  42.     }
  43.   if (is_other_disk(disk, r, c + 1)) // rigtht squares
  44.     for (int j = c + 2; j < nr_squares; j++) {
  45.       if (board[r][j] == disk)
  46.         return true;
  47.       else if (board[r][j] == '-')
  48.         break;
  49.     }
  50.   if (is_other_disk(disk, r - 1, c - 1)) // diagonally upper left squares
  51.     for (int i = r - 2, j = c - 2; i >= 0 && j >= 0; i--, j--) {
  52.       if (board[i][j] == disk)
  53.         return true;
  54.       else if (board[i][j] == '-')
  55.         break;
  56.     }
  57.   if (is_other_disk(disk, r + 1, c - 1)) // diagonally lower left squares
  58.     for (int i = r + 2, j = c - 2; i < nr_squares && j >= 0; i++, j--) {
  59.       if (board[i][j] == disk)
  60.         return true;
  61.       else if (board[i][j] == '-')
  62.         break;
  63.     }
  64.   if (is_other_disk(disk, r - 1, c + 1)) // diagonally upper rigtht squares
  65.     for (int i = r - 2, j = c + 2; i >= 0 && j < nr_squares; i--, j++) {
  66.       if (board[i][j] == disk)
  67.         return true;
  68.       else if (board[i][j] == '-')
  69.         break;
  70.     }
  71.   if (is_other_disk(disk, r + 1, c + 1)) // diagonally lower right squares
  72.     for (int i = r + 2, j = c + 2; i < nr_squares && j < nr_squares; i++, j++) {
  73.       if (board[i][j] == disk)
  74.         return true;
  75.       else if (board[i][j] == '-')
  76.         break;
  77.     }
  78.   return false;
  79. }
  80.  
  81. bool print_leagal_moves(char disk)
  82. {
  83.   bool leagal = false;
  84.   for (int r = 0; r < nr_squares; r++)
  85.     for (int c = 0; c < nr_squares; c++)
  86.       if (board[r][c] == '-' && is_leagal_move(disk, r, c)) {
  87.         if (leagal)
  88.           putchar(' ');
  89.         leagal = true;
  90.         printf("(%d,%d)", r + 1, c + 1);
  91.       }
  92.   if (leagal)
  93.     putchar('\n');
  94.   else
  95.     puts("No legal move.");
  96.   return leagal;
  97. }
  98.  
  99. void move(char disk, int r, int c, int& nr_white, int& nr_black)
  100. {
  101.   board[r][c] = disk;
  102.   int nr_changed = 0;
  103.   if (is_other_disk(disk, r - 1, c)) // above squares
  104.     for (int i = r - 2; i >= 0; i--) {
  105.       if (board[i][c] == disk) {
  106.         for (i++; i < r; i++, nr_changed++)
  107.           board[i][c] = disk;
  108.         break;
  109.       }
  110.       else if (board[i][c] == '-')
  111.         break;
  112.     }
  113.   if (is_other_disk(disk, r + 1, c)) // below squares
  114.     for (int i = r + 2; i < nr_squares; i++) {
  115.       if (board[i][c] == disk) {
  116.         for (i--; i > r; i--, nr_changed++)
  117.           board[i][c] = disk;
  118.         break;
  119.       }
  120.       else if (board[i][c] == '-')
  121.         break;
  122.     }
  123.   if (is_other_disk(disk, r, c - 1)) // left squares
  124.     for (int j = c - 2; j >= 0; j--) {
  125.       if (board[r][j] == disk) {
  126.         for (j++; j < c; j++, nr_changed++)
  127.           board[r][j] = disk;
  128.         break;
  129.       }
  130.       else if (board[r][j] == '-')
  131.         break;
  132.     }
  133.   if (is_other_disk(disk, r, c + 1)) // rigtht squares
  134.     for (int j = c + 2; j < nr_squares; j++) {
  135.       if (board[r][j] == disk) {
  136.         for (j--; j > c; j--, nr_changed++)
  137.           board[r][j] = disk;
  138.         break;
  139.       }
  140.       else if (board[r][j] == '-')
  141.         break;
  142.     }
  143.   if (is_other_disk(disk, r - 1, c - 1)) // diagonally upper left squares
  144.     for (int i = r - 2, j = c - 2; i >= 0 && j >= 0; i--, j--) {
  145.       if (board[i][j] == disk) {
  146.         for (i++, j++; i < r && j < c; i++, j++, nr_changed++)
  147.           board[i][j] = disk;
  148.         break;
  149.       }
  150.       else if (board[i][j] == '-')
  151.         break;
  152.     }
  153.   if (is_other_disk(disk, r + 1, c - 1)) // diagonally lower left squares
  154.     for (int i = r + 2, j = c - 2; i < nr_squares && j >= 0; i++, j--) {
  155.       if (board[i][j] == disk) {
  156.         for (i--, j++; i > r && j < c; i--, j++, nr_changed++)
  157.           board[i][j] = disk;
  158.         break;
  159.       }
  160.       else if (board[i][j] == '-')
  161.         break;
  162.     }
  163.   if (is_other_disk(disk, r - 1, c + 1)) // diagonally upper rigtht squares
  164.     for (int i = r - 2, j = c + 2; i >= 0 && j < nr_squares; i--, j++) {
  165.       if (board[i][j] == disk) {
  166.         for (i++, j--; i < r && j > c; i++, j--, nr_changed++)
  167.           board[i][j] = disk;
  168.         break;
  169.       }
  170.       else if (board[i][j] == '-')
  171.         break;
  172.     }
  173.   if (is_other_disk(disk, r + 1, c + 1)) // diagonally lower right squares
  174.     for (int i = r + 2, j = c + 2; i < nr_squares && j < nr_squares; i++, j++) {
  175.       if (board[i][j] == disk) {
  176.         for (i--, j--; i > r && j > c; i--, j--, nr_changed++)
  177.           board[i][j] = disk;
  178.         break;
  179.       }
  180.       else if (board[i][j] == '-')
  181.         break;
  182.     }
  183.  
  184.   if (disk == 'W') {
  185.     nr_white += nr_changed + 1; nr_black -= nr_changed;
  186.   }
  187.   else {
  188.     nr_white -= nr_changed; nr_black += nr_changed + 1;
  189.   }
  190. }
  191.  
  192. int main()
  193. {
  194.   int nr_games;
  195.   scanf("%d", &nr_games);
  196.   while (nr_games--) {
  197.     for (int i = 0; i < nr_squares; i++)
  198.       scanf("%s", board[i]);
  199.     int nr_white = 0, nr_black = 0;
  200.     for (int r = 0; r < nr_squares; r++)
  201.       for (int c = 0; c < nr_squares; c++) {
  202.         if (board[r][c] == 'W')
  203.           nr_white++;
  204.         else if (board[r][c] == 'B')
  205.           nr_black++;
  206.       }
  207.     char command[4];
  208.     scanf("%s", command);
  209.     char disk = command[0];
  210.     bool quit = false;
  211.     while (!quit) {
  212.       scanf("%s", command);
  213.       switch (command[0]) {
  214.       case 'L':
  215.         if (!print_leagal_moves(disk))
  216.           disk = (disk == 'W') ? 'B' : 'W';
  217.         break;
  218.       case 'M':
  219.         move(disk, command[1] - '1', command[2] - '1', nr_white, nr_black);
  220.         printf("Black - %2d White - %2d\n", nr_black, nr_white);
  221.         disk = (disk == 'W') ? 'B' : 'W';
  222.         break;
  223.       default:
  224.         quit = true;
  225.         for (int i = 0; i < nr_squares; i++)
  226.           puts(board[i]);
  227.         break;
  228.       }
  229.     }
  230.     if (nr_games)
  231.       putchar('\n');
  232.   }
  233.   return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement