Advertisement
Guest User

Untitled

a guest
Jul 16th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n;
  5. int m[8][8];
  6. char v[20][10];
  7.  
  8. void zera(){
  9.     for(int i = 0; i < 8; i++)
  10.         for(int j = 0; j < 8; j++)
  11.             m[i][j] = 0;
  12. }
  13.  
  14. bool dentro(int i, int j){
  15.     if(i < 0 or i > 7 or j < 0 or j > 7)
  16.         return false;
  17.     return true;
  18. }
  19.  
  20. bool comeu(int i, int j){
  21.     if(dentro(i, j) and m[i][j] == 2)
  22.         return true;
  23.     return false;
  24. }
  25.  
  26. bool abigo(int i, int j){
  27.     if(dentro(i, j) and m[i][j] == 1)
  28.         return true;
  29.     return false;
  30. }
  31.  
  32. bool move(int i, int j, vector<int> &dx, vector<int> &dy, int lim){
  33.     for(int k = 0; k < dx.size(); k++){
  34.         int x = i, y = j;
  35.         for(int l = 0; l < lim; l++){
  36.             x += dx[k]; y += dy[k];
  37.             if(comeu(x, y))
  38.                 return true;
  39.             if(!dentro(x, y) or abigo(x, y))
  40.                 break;
  41.         }
  42.     }
  43.     return false;
  44. }
  45.  
  46. bool peao(int i, int j){
  47.     vector<int> dx = {1, 1};
  48.     vector<int> dy = {1, -1};
  49.     return move(i, j, dx, dy, 1);
  50. }
  51.  
  52. bool bispo(int i, int j){
  53.     vector<int> dx = {1, 1, -1, -1};
  54.     vector<int> dy = {-1, 1, -1, 1};
  55.     return move(i, j, dx, dy, 8);
  56. }
  57.  
  58. bool torre(int i, int j){
  59.     vector<int> dx = {0, 1, 0, -1};
  60.     vector<int> dy = {1, 0, -1, 0};
  61.     return move(i, j, dx, dy, 8);
  62. }
  63.  
  64. bool rainha(int i, int j){
  65.     return (bispo(i, j) or torre(i, j));
  66. }
  67.  
  68. bool rei(int i, int j){
  69.     vector<int> dx = {-1, 0, 1, 1, 1, 0, -1, -1};
  70.     vector<int> dy = {1, 1, 1, 0, -1, -1, -1, 0};
  71.     return move(i, j, dx, dy, 1);
  72. }
  73.  
  74. bool peca(int i){
  75.     int x = '8' - v[i][2], y = v[i][1] - 'a';
  76.     if(m[x][y] == 2)
  77.         return false;
  78.     if(v[i][0] == 'P')
  79.         return peao(x, y);
  80.     if(v[i][0] == 'T')
  81.         return torre(x, y);
  82.     if(v[i][0] == 'B')
  83.         return bispo(x, y);
  84.     if(v[i][0] == 'R')
  85.         return rainha(x, y);
  86.     return rei(x, y);
  87. }
  88.  
  89. bool confere(int i, int j){
  90.     if(!dentro(i, j))
  91.         return true;
  92.  
  93.     int aux = m[i][j];
  94.     m[i][j] = 2;
  95.  
  96.     for(int k = 0; k < n; k++)
  97.         if(peca(k)){
  98.             m[i][j] = aux;
  99.             return true;
  100.         }
  101.  
  102.     m[i][j] = aux;
  103.     return false;
  104. }
  105.  
  106. int main(int argc, char const *argv[])
  107. {
  108.     while(scanf(" %i", &n) != EOF){
  109.         zera();
  110.         for(int i = 0 ; i < n; i++){
  111.             cin >> v[i];
  112.             m['8'-v[i][2]][v[i][1]-'a'] = 1;
  113.         }
  114.  
  115.         string k; cin >> k;
  116.         int x = '8'-k[2], y = k[1]-'a';
  117.  
  118.         int ok = 1;
  119.         if(!confere(x, y))
  120.             ok = 0;
  121.  
  122.         vector<int> dx = {-1, 0, 1, 1, 1, 0, -1, -1};
  123.         vector<int> dy = {1, 1, 1, 0, -1, -1, -1, 0};
  124.  
  125.         for(int i = 0; i < 8 and ok; i++)
  126.             if(!confere(x+dx[i], y+dy[i])){
  127.                 ok = 0;
  128.             }
  129.        
  130.         printf(ok ? "SIM\n" : "NAO\n");
  131.     }
  132.  
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement