Advertisement
Sunjaree

Facebook Hacker Cup: Problem B: Xs and Os

Aug 31st, 2021
1,455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.31 KB | None | 0 0
  1. /*https://www.facebook.com/codingcompetitions/hacker-cup/2021/qualification-round/problems/B*/
  2. #include<bits/stdc++.h>
  3. using  namespace  std;
  4.  
  5. #define endl         "\n"
  6. #define ll           long long
  7. #define PI           acos(-1.0)
  8. #define GCD(a,b)     __gcd(a , b)
  9. #define LCM(a,b)     ((a/__gcd(a,b))*b)
  10. #define READ(f)      freopen(f,"r",stdin)
  11. #define WRITE(f)     freopen(f,"w",stdout)
  12. #define test         cout<<"\n*************\n"
  13. #define mem(arr,val) memset(arr,val,sizeof(arr))
  14. #define precise(c)   fixed(cout);cout<<setprecision(c)
  15. #define valid(x,y)   (x>=0 && x<row && y>=0 && y<column)
  16. #define fast         ios_base :: sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  17.  
  18.  
  19. char arr[100][100];
  20. char arrcount[100][100];
  21.  
  22. ll horizontal(ll x, ll n, bool minimumfound,ll minimum_element, bool one){
  23.  
  24.     if(one){
  25.  
  26.         bool flag = true;
  27.         for(ll i=0;i<n;i++){
  28.             if(arrcount[x][i] == '.' && minimum_element){
  29.                 minimum_element--;
  30.                 arrcount[x][i] = '#';
  31.             } else if(arrcount[x][i]=='#' || arrcount[x][i] == 'O' || (minimum_element==0 && arrcount[x][i]=='.')){
  32.                 flag = false;
  33.             }
  34.         }
  35.  
  36.         if(flag){
  37.             return 1;
  38.         } else{
  39.             for(ll i=0;i<n;i++){
  40.                 if(arrcount[x][i] == '#'){
  41.                     arrcount[x][i] = '.';
  42.                 }
  43.             }
  44.             return 0;
  45.         }
  46.  
  47.  
  48.     } else if(!minimumfound){
  49.         ll numx = 0;
  50.         bool flag = true;
  51.         for(ll i=0;i<n;i++){
  52.             if(arr[x][i] == '.' || arr[x][i] == '*'){
  53.                 arr[x][i] = '*';
  54.                 numx++;
  55.             } else if(arr[x][i] == 'O'){
  56.                 flag = false;
  57.             }
  58.         }
  59.  
  60.         if(flag){
  61.             return numx;
  62.         } else{
  63.             return 100000;
  64.         }
  65.     } else{
  66.  
  67.  
  68.         bool flag = true;
  69.         for(ll i=0;i<n;i++){
  70.             if(arrcount[x][i] == '.' && minimum_element){
  71.                 minimum_element--;
  72.  
  73.             } else if(arrcount[x][i]=='#' || arrcount[x][i] == 'O' || (minimum_element==0 && arrcount[x][i]=='.')){
  74.                 flag = false;
  75.             }
  76.         }
  77.  
  78.         if(flag){
  79.  
  80.             return 1;
  81.         } else{
  82.             return 0;
  83.         }
  84.  
  85.  
  86.     }
  87. }
  88.  
  89. ll vertical(ll x, ll n, bool minimumfound,ll minimum_element, bool one){
  90.  
  91.     if(one){
  92.  
  93.         bool flag = true;
  94.         for(ll i=0;i<n;i++){
  95.             if(arrcount[i][x] == '.' && minimum_element){
  96.                 minimum_element--;
  97.                 arrcount[i][x] = '#';
  98.             } else if(arrcount[i][x]=='#' || arrcount[i][x] == 'O' || (minimum_element==0 && arrcount[i][x]=='.')){
  99.                 flag = false;
  100.             }
  101.         }
  102.  
  103.         if(flag){
  104.  
  105.             return 1;
  106.         } else{
  107.             for(ll i=0;i<n;i++){
  108.                 if(arrcount[i][x] == '#'){
  109.                     arrcount[i][x] = '.';
  110.                 }
  111.             }
  112.             return 0;
  113.         }
  114.  
  115.     } else if(!minimumfound) {
  116.         ll numx = 0;
  117.         bool flag = true;
  118.         for (ll i = 0; i < n; i++) {
  119.             if (arr[i][x] == '.' || arr[i][x] == '*') {
  120.                 arr[i][x] = '*';
  121.                 numx++;
  122.             } else if (arr[i][x] == 'O') {
  123.                 flag = false;
  124.             }
  125.         }
  126.  
  127.         if (flag) {
  128.             return numx;
  129.         } else {
  130.             return 100000;
  131.         }
  132.     } else{
  133.  
  134.         bool flag = true;
  135.  
  136.         for(ll i=0;i<n;i++){
  137.             if(arrcount[i][x] == '.' && minimum_element){
  138.                 minimum_element--;
  139.             } else if(arrcount[i][x]=='#' || arrcount[i][x] == 'O' || (minimum_element==0 && arrcount[i][x]=='.')){
  140.                 flag = false;
  141.             }
  142.         }
  143.  
  144.         if(flag){
  145.  
  146.             return 1;
  147.         } else{
  148.             return 0;
  149.         }
  150.  
  151.     }
  152. }
  153.  
  154.  
  155. int main(){
  156.  
  157.  
  158.     READ("input.txt");
  159.     WRITE("out.txt");
  160.  
  161.     ll t, con = 1;
  162.     cin>>t;
  163.  
  164.     while(t--){
  165.  
  166.         ll n;
  167.         cin>>n;
  168.         bool minimumfound = false;
  169.  
  170.         for(ll i=0;i<n;i++){
  171.             for(ll j=0;j<n;j++){
  172.                 cin>>arr[i][j];
  173.                 arrcount[i][j] = arr[i][j];
  174.             }
  175.         }
  176.  
  177.         vector<ll> x;
  178.         bool one = false;
  179.  
  180.         ll minimum_element = 0;
  181.         for(ll i=0;i<n;i++){
  182.             ll numx = 0;
  183.             numx = horizontal(i, n,minimumfound,minimum_element,one);
  184.             x.push_back(numx);
  185.         }
  186.  
  187.         for(ll i=0;i<n;i++){
  188.             ll numx = 0;
  189.             numx= vertical(i, n, minimumfound,minimum_element,one);
  190.             x.push_back(numx);
  191.         }
  192.  
  193.  
  194.         minimum_element = *min_element(x.begin(),x.end());
  195.         ll count = 0;
  196.  
  197.         minimumfound = true;
  198.  
  199.  
  200.         if(minimum_element==1){
  201.             one = true;
  202.         }
  203.  
  204.         for(ll i=0;i<n;i++){
  205.             count = count + horizontal(i, n,minimumfound,minimum_element,one);
  206.         }
  207.  
  208.         for(ll i=0;i<n;i++){
  209.             count = count + vertical(i, n, minimumfound,minimum_element,one);
  210.         }
  211.  
  212.  
  213.         if(minimum_element==100000){
  214.             cout << "Case #" << con << ": Impossible"<< endl;
  215.         } else{
  216.             cout << "Case #" << con << ": " <<minimum_element<<" "<<count<< endl;
  217.         }
  218.  
  219.  
  220.         con++;
  221.     }
  222.  
  223.     return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement