Cod sursă (job #763436)

Utilizator avatar AnAverageTurtle Visan Mihnea Alexandru AnAverageTurtle IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp-32 | 4,15 kb
Rundă Arhiva de probleme Status evaluat
Dată 20 feb. 2024 13:04:46 Scor 0
#include <fstream>

using namespace std;

ifstream cin ( "immortal.in" ) ;
ofstream cout ( "immortal.out" ) ;

int directions ( int i , int j , int mat [ ] [ ] , int killqueue , int afis , int h ) {
   if ( mat [ i + 1 ] [ j ] > 0 && mat [ i + 2 ] [ j ] == 0 )
   {
      afis [ h ] [ 1 ] = i ;
      afis [ h ] [ 2 ] = j ;
      afis [ h ] [ 3 ] = i + 2 ;
      afis [ h ] [ 4 ] = j ;
      killqueue [ 1 ] = i ;
      killqueue [ 2 ] = j ;
      killqueue [ 3 ] = mat [ i ] [ j ] ;
      killqueue [ 4 ] = 1 ;
      killqueue [ 5 ] = 3 ;
      backtrack ( mat , alive , killqueue , afis , imm , h + 1 ) ;
   }
   if ( mat [ i - 1 ] [ j ] > 0 && mat [ i - 2 ] [ j ] == 0 )
   {
      afis [ h ] [ 1 ] = i ;
      afis [ h ] [ 2 ] = j ;
      afis [ h ] [ 3 ] = i - 2 ;
      afis [ h ] [ 4 ] = j ;
      killqueue [ 1 ] = i ;
      killqueue [ 2 ] = j ;
      killqueue [ 3 ] = mat [ i ] [ j ] ;
      killqueue [ 4 ] = 2 ;
      killqueue [ 5 ] = 3 ;
      backtrack ( mat , alive , killqueue , afis , imm , h + 1 ) ;
   }
   if ( mat [ i ] [ j + 1 ] > 0 && mat [ i ] [ j  + 2 ] == 0 )
   {
      afis [ h ] [ 1 ] = i ;
      afis [ h ] [ 2 ] = j ;
      afis [ h ] [ 3 ] = i ;
      afis [ h ] [ 4 ] = j + 2 ;
      killqueue [ 1 ] = i ;
      killqueue [ 2 ] = j ;
      killqueue [ 3 ] = mat [ i ] [ j ] ;
      killqueue [ 4 ] = 3 ;
      killqueue [ 5 ] = 3 ;
      backtrack ( mat , alive , killqueue , afis , imm , h + 1 ) ;
   }
   if ( mat [ i ] [ j - 1 ] > 0 && mat [ i ] [ j - 2 ] == 0 )
   {
      afis [ h ] [ 1 ] = i ;
      afis [ h ] [ 2 ] = j ;
      afis [ h ] [ 3 ] = i ;
      afis [ h ] [ 4 ] = j - 2 ;
      killqueue [ 1 ] = i ;
      killqueue [ 2 ] = j ;
      killqueue [ 3 ] = mat [ i ] [ j ] ;
      killqueue [ 4 ] = 4 ;
      killqueue [ 5 ] = 3 ;
      backtrack ( mat , alive , killqueue , afis , imm , h + 1 ) ;
   }
}
//  mat i , j ; alive i ; direction ; cond ;
int backtrack ( int mat [ ] [ ] , int alive [ ] , int killqueue [ ] , int imm , int h ) {
   int i , j , ok  = 0 ;
   if ( killqueue [ 5 ] != 0 ) {
      alive [ killqueue [ 3 ] ] = -1 ;
      if ( killqueue [ 4 ] == 1 ) {
         mat [ killqueue [ 1 ] + 2 ] [ killqueue [ 2 ] ] = mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] ;
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] = 0 ;
      }
      if ( killqueue [ 4 ] == 2 ) {
         mat [ killqueue [ 1 ] - 2 ] [ killqueue [ 2 ] ] = mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] ;
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] = 0 ;
      }
      if ( killqueue [ 4 ] == 1 ) {
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] + 2 ] = mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] ;
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] = 0 ;
      }
      if ( killqueue [ 4 ] == 1 ) {
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] - 2 ] = mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] ;
         mat [ killqueue [ 1 ] ] [ killqueue [ 2 ] = 0 ;
      }
      killqueue [ 1 ] = 0 ;
      killqueue [ 2 ] = 0 ;
      killqueue [ 3 ] = 0 ;
      killqueue [ 4 ] = 0 ;
      killqueue [ 5 ] = 0 ;
   }
   for ( i = 0 ; i < n ; i ++ ) {
      if ( alive [ i ] != -1 ){
         for ( j = 0 ; j < n ; j ++ ) {
            if ( i != j && alive [ j ] != -1 ) {
               directions ( i , j , mat , killqueue ) ;
               ok = 1 ;
            }
         }
      }
   }
   if ( ok == 0 )
   {
      for ( i = 0 ; i < h ; i ++ ) {
         cout << afis [ i ] [ 1 ] << " " << afis [ i ] [ 2 ] << " " << afis [ i ] [ 3 ] << " " << afis [ i ] [ 4 ] << "\n" ;
      }
      return 0 ;
   }
}

int main()
{
   int alive [ 401 ] ;
   int mat [ 23 ] [ 23 ] = {} ;
   int killqueue [ 6 ] = {} ;
   int afis [ 401 ] [ 5 ] ;
   int lin , col , imm ;
   int i , j , x , y ;

   cin >> lin >> col >> imm ;

   for ( i = 0 ; i < lin ; i ++ )
      for ( j = 0 ; j < col ; j ++ ) {
         mat [ i ] [ j ] = -1 ;
      }

   for ( i = 0 ; i < imm ; i ++ )
   {
      cin >> x >> y ;
      mat [ x ] [ y ] = i + 1 ;
      alive [ i ] = i + 1 ;
   }
   killqueue [ 5 ] = 2395 ;

   backtrack ( mat [ ] [ ] , alive [ ] , killqueue [ ] , afis [ ] [ ] , imm , 0 ) ;
   return 0;
}