Advertisement
MiinaMagdy

10284 - Chessboard in FEN

Sep 6th, 2022
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define endl '\n'
  7. #define sz(x) int(x.size())
  8. #define all(x) x.begin(), x.end()
  9.  
  10. int main() {
  11.     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  12.    
  13.     string s;
  14.     while (cin >> s) {
  15.         if (s == "") break;
  16.         int row = 0, col = 0;
  17.         auto valid = [](int i, int j) -> bool {
  18.             return 0 <= i && i < 8 && 0 <= j && j < 8;
  19.         };
  20.         vector<vector<bool>> under_attack(8, vector<bool>(8, 0));
  21.         vector<vector<bool>> occ(8, vector<bool>(8, 0));
  22.         for (int J = 0; J < sz(s); J++) {
  23.             if (s[J] == '/') row++, col = 0;
  24.             else  {
  25.                 if (isdigit(s[J])) col += s[J] - '0';
  26.                 else {
  27.                     occ[row][col] = 1;
  28.                     col++;
  29.                 }
  30.             }
  31.         }
  32.         row = 0, col = 0;
  33.         for (int J = 0; J < sz(s); J++) {
  34.             if (s[J] == '/') row++, col = 0;
  35.             else {
  36.                 if (isdigit(s[J])) col += s[J] - '0';
  37.                 else {
  38.                     if (s[J] == 'q' || s[J] == 'Q') { // Queen
  39.                         for (int i = 1; i <= 8; i++) {
  40.                             if (valid(row + i, col + i)) {
  41.                                 if (occ[row + i][col + i]) break;
  42.                                 under_attack[row + i][col + i] = 1;
  43.                             }
  44.                         }
  45.                         for (int i = 1; i <= 8; i++) {
  46.                             if (valid(row - i, col - i)) {
  47.                                 if (occ[row - i][col - i]) break;
  48.                                 under_attack[row - i][col - i] = 1;
  49.                             }
  50.                         }
  51.                        
  52.                         for (int i = 1; i <= 8; i++) {
  53.                             if (valid(row + i, col)) { 
  54.                                 if (occ[row + i][col]) break;
  55.                                 under_attack[row + i][col] = 1;
  56.                             }
  57.                         }
  58.                        
  59.                         for (int i = 1; i <= 8; i++) {
  60.                             if (valid(row - i, col)) {
  61.                                 if (occ[row - i][col]) break;
  62.                                 under_attack[row - i][col] = 1;
  63.                             }
  64.                         }
  65.                        
  66.                         for (int i = 1; i <= 8; i++) {
  67.                             if (valid(row, col + i)) {
  68.                                 if (occ[row][col + i]) break;
  69.                                 under_attack[row][col + i] = 1;
  70.                             }                          
  71.                         }
  72.                         for (int i = 1; i <= 8; i++) {
  73.                             if (valid(row, col - i)) {
  74.                                 if (occ[row][col - i]) break;
  75.                                 under_attack[row][col - i] = 1;
  76.                             }                          
  77.                         }
  78.                        
  79.                         for (int i = 1; i <= 8; i++) {
  80.                             if (valid(row - i, col + i)) {
  81.                                 if (occ[row - i][col + i]) break;
  82.                                 under_attack[row - i][col + i] = 1;
  83.                             }
  84.                         }
  85.                         for (int i = 1; i <= 8; i++) {
  86.                             if (valid(row + i, col - i)) {
  87.                                 if (occ[row + i][col - i]) break;
  88.                                 under_attack[row + i][col - i] = 1;
  89.                             }
  90.                         }
  91.                     }
  92.                     else if (s[J] == 'p' || s[J] == 'P') {
  93.                         if (valid(row + (s[J] == 'p' ? 1 : -1), col + 1))
  94.                             under_attack[row + (s[J] == 'p' ? 1 : -1)][col + 1] = 1;
  95.                         if (valid(row + (s[J] == 'p' ? 1 : -1), col - 1))
  96.                             under_attack[row + (s[J] == 'p' ? 1 : -1)][col - 1] = 1;
  97.                     }
  98.                     else if (s[J] == 'r' || s[J] == 'R') {
  99.                         for (int i = 1; i <= 8; i++) {
  100.                             if (valid(row + i, col)) {
  101.                                 if (occ[row + i][col]) break;
  102.                                 under_attack[row + i][col] = 1;
  103.                             }
  104.                         }
  105.                        
  106.                         for (int i = 1; i <= 8; i++) {
  107.                             if (valid(row - i, col)) {
  108.                                 if (occ[row - i][col]) break;
  109.                                 under_attack[row - i][col] = 1;
  110.                             }
  111.                         }
  112.                        
  113.                         for (int i = 1; i <= 8; i++) {
  114.                             if (valid(row, col + i)) {
  115.                                 if (occ[row][col + i]) break;
  116.                                 under_attack[row][col + i] = 1;
  117.                             }                          
  118.                         }
  119.                         for (int i = 1; i <= 8; i++) {
  120.                             if (valid(row, col - i)) {
  121.                                 if (occ[row][col - i]) break;
  122.                                 under_attack[row][col - i] = 1;
  123.                             }                          
  124.                         }
  125.                        
  126.                     }
  127.                     else if (s[J] == 'b' || s[J] == 'B') {
  128.                         for (int i = 1; i <= 8; i++) {
  129.                             if (valid(row + i, col + i)) {
  130.                                 if (occ[row + i][col + i]) break;
  131.                                 under_attack[row + i][col + i] = 1;
  132.                             }
  133.                         }
  134.                         for (int i = 1; i <= 8; i++) {
  135.                             if (valid(row - i, col - i)) {
  136.                                 if (occ[row - i][col - i]) break;
  137.                                 under_attack[row - i][col - i] = 1;
  138.                             }
  139.                         }
  140.                        
  141.                         for (int i = 1; i <= 8; i++) {
  142.                             if (valid(row - i, col + i)) {
  143.                                 if (occ[row - i][col + i]) break;
  144.                                 under_attack[row - i][col + i] = 1;
  145.                             }
  146.                         }
  147.                         for (int i = 1; i <= 8; i++) {
  148.                             if (valid(row + i, col - i)) {
  149.                                 if (occ[row + i][col - i]) break;
  150.                                 under_attack[row + i][col - i] = 1;
  151.                             }
  152.                         }
  153.                     }
  154.                     else if (s[J] == 'n' || s[J] == 'N') {
  155.                         vector<pair<int, int>> knight_moves = {
  156.                             {2, 1}, {2, -1}, {-2, 1}, {-2, -1},
  157.                             {1, 2}, {-1, 2}, {1, -2}, {-1, -2}
  158.                         };
  159.                         for (auto & it : knight_moves) {
  160.                             int dx = it.first + row, dy = it.second + col;
  161.                             if (valid(dx, dy)) under_attack[dx][dy] = 1;
  162.                         }
  163.                     }
  164.                     else if (s[J] == 'k' || s[J] == 'K') {
  165.                         for (int i = -1; i < 2; i++) {
  166.                             for (int j = -1; j < 2; j++) {
  167.                                 int dx = row + i, dy = col + j;
  168.                                 if (valid(dx, dy)) under_attack[dx][dy] = 1;
  169.                             }
  170.                         }
  171.                     }
  172.                     under_attack[row][col] = 1;
  173.                     col++;
  174.                 }
  175.             }
  176.         }
  177.         int cnt = 0;
  178.         for (int i = 0; i < 8; i++) {
  179.             for (int j = 0; j < 8; j++) {
  180.                 cnt += (under_attack[i][j] == 0);
  181.             }
  182.         }
  183.         cout << cnt << endl;
  184.         s = "";
  185.     }
  186. }
  187.  
  188.  
  189.  
Tags: UVA CP3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement