Cod sursa(job #614936)

Utilizator CS-meStanca Marian Ciprian CS-me Data 8 octombrie 2011 09:13:42
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<stdio.h>
FILE *fin=fopen("avioane.in","r");
FILE *fout=fopen("avioane.out","w");

int a[4][5][5]={
{
{0,0,1,0,0},
{1,1,1,1,1},
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,1,0,0}
},
{
{0,1,0,0,0},
{0,1,0,1,0},
{1,1,1,1,1},
{0,1,0,1,0},
{0,1,0,0,0}
},
{
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,1,0,0},
{1,1,1,1,1},
{0,0,1,0,0}
},
{
{0,0,0,1,0},
{0,1,0,1,0},
{1,1,1,1,1},
{0,1,0,1,0},
{0,0,0,1,0}
}
};



void back(int i, int j, int k){

    if(k>max){
        max=k;
    }


    if(i>n-5){
        return;
    }

    // verific daca pot sa pun in pozitia i,j una din cele 4 matrice

    for(d=0;d<=3;d++){
        ok=1; // presupun sa pot sa puns

        for(ii=0;ii<=4 && ok;ii++){
            for(jj=0;jj<=4 && ok;jj++){
                if(s[i+ii][j+jj]*a[d][ii][jj]!=0 ){ //verific daca elementul este liber, pentru a putea pune avionul
                    ok=0; // deci nu pot sa pun
                }
            }
        }

        if(ok){  // pot sa pun sau sa nu pun si sa fac auto-apel

            for(ii=0;ii<=4;i++){
                for(jj=0;jj<=4;jj++){
                    s[ii+i][j+jj]+=(k+1)*a[d][ii][jj];
                }
            }
            if(j<n-5) back(i,j+1,k+1);
            else back(i+1,1,k+1);

            for(ii=0;ii<=4;i++){
                for(jj=0;jj<=4;jj++){
                    s[ii+i][j+jj]-=(k+1)*a[d][ii][jj];
                }
            }

            if(j<n-5) back(i,j+1,k);
            else back(i+1,1,k);

        }
        else{    // nu pot sa pun, fac auto-apel
            if(j<n-5) back(i,j+1,k);
            else back(i+1,1,k);
        }


    }


}







int main(){

    fscanf(fin,"%d",&n);

    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            fsanf(fin,"%d",&s[i][j]);
        }
    }

    back(1,1,0);


return 0;
}