Cod sursă (job #115740)

Utilizator avatar dummy contdezactivat dummy IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 3,45 kb
Rundă Tema 14 clasele 9-10 2014/15 Status evaluat
Dată 10 feb. 2015 00:35:05 Scor 25
#include <fstream>
#define Dragoste 20
#define Smerenie 15
#define Nadejde 4

using namespace std ;

typedef struct {
        short l , c ;
}       immortal ;

typedef struct {
        short l , c , dir ;
}       solution ;

immortal imm[ Smerenie ] ;
solution Sol[ Smerenie ] ;
bool Board[ Dragoste ][ Dragoste ] ;
short Go[ Nadejde ][ 2 ] = { { -1 , 0 } ,  {  0 , 1  } , { 1 , 0 } , { 0 , -1 } } ;
short nl , nc , nondp , nonp ;
bool gasit ;

ofstream fout( "immortal.out" ) ;

void PrintSolution( )
{
    short i ;
    for( i = nondp ; i > 1 ; i -- )
       {
         fout<< Sol[ i ].l + 1 <<" " ;
         fout<< Sol[ i ].c + 1 <<" " ;
         fout<< Sol[ i ].l + ( Go[ Sol[ i ].dir ][ 0 ] << 1 ) + 1 <<" " ;
         fout<< Sol[ i ].c + ( Go[ Sol[ i ].dir ][ 1 ] << 1 ) + 1 <<" " ;
         fout<< "\n" ;
       }
    fout.close( ) ;
}

void SearchNext ( )
{
    short i , j ;
    short l1 ;
    short c1 ;
    short l2 ;
    short c2 ;

    if( !gasit )
      {
       if( nonp == 1 )
         {
           PrintSolution( ) ;
           gasit = 1 ;
         }
       else
          {
          for( i = 0 ; i < nondp ; i ++ )
             {
             if( Board[ imm[ i ].l ][ imm[ i ].c ] )
               {
                for( j = 0 ; j < Nadejde ; j ++ )
                   {
                     if( imm[ i ].l + ( Go[ j ][ 0 ] << 1 ) < nl && imm[ i ].c + ( Go[ j ][ 1 ] << 1 ) < nc && imm[ i ].l + ( Go[ j ][ 0 ] << 1 ) >= 0 && imm[ i ].c + ( Go[ j ][ 1 ] << 1 ) >= 0 && Board[ imm[ i ].l + Go[ j ][ 0 ] ][ imm[ i ].c + Go[ j ][ 1 ] ] && !Board[ imm[ i ].l + ( Go[ j ][ 0 ] << 1 )][ imm[ i ].c + ( Go[ j ][ 1 ] << 1 )] )
                       {
                        l1 = imm[ i ].l + Go[ j ][ 0 ] ;
                        c1 = imm[ i ].c + Go[ j ][ 1 ] ;
                        l2 = imm[ i ].l + ( Go[ j ][ 0 ] << 1 ) ;
                        c2 = imm[ i ].c + ( Go[ j ][ 1 ] << 1 ) ;

                        ///Schimbam valoarea de adevar a pozitiilor
                        Board[ imm[ i ].l ][ imm[ i ].c ] = 0 ;
                        Board[ l1 ][ c1 ] = 0 ;
                        Board[ l2 ][ c2 ] = 1 ;

                        Sol[ nonp ] = { imm[ i ].l , imm[ i ].c , j } ;

                        imm[ i ].l = l2 ;
                        imm[ i ].c = c2 ;
                        nonp -- ;

                        ///Apelam recursiv functia SearchNext
                        SearchNext( ) ;

                        ///Refacem tabla de joc
                        nonp ++ ;

                        imm[ i ].l = l2 - ( Go[ j ][ 0 ] << 1 ) ;
                        imm[ i ].c = c2 - ( Go[ j ][ 1 ] << 1 ) ;

                        Board[ imm[ i ].l ][ imm[ i ].c ] = 1 ;
                        Board[ l1 ][ c1 ] = 1 ;
                        Board[ l2 ][ c2 ] = 0 ;
                        }
                    }
                }
            }
         }
    }
}

int main( )
{
    short i , linie , coloana ;

    ifstream fin ( "immortal.in" ) ;

    fin>>nl>>nc>>nondp ;

    for( i = 0 ; i < nondp ; i ++ )
       {
         fin>>linie>>coloana ;
         imm[ i ].l = linie - 1 ;
         imm[ i ].c = coloana - 1 ;
         Board[ imm[ i ].l ][ imm[ i ].c ] = 1 ;
       }
    ///fout<<"Iisuse miluieste - ma ";

    fin.close( ) ;

    nonp = nondp ;

    SearchNext( ) ;

    return 0 ;
    ///Gresit-am inaintea Ta si nu sunt vrednic sa ma numesc fiul Tau
}