Cod sursă (job #154147)

Utilizator avatar 1Anonymus Robert Vadastreanu 1Anonymus IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 3,08 kb
Rundă Arhiva de probleme Status evaluat
Dată 29 aug. 2015 16:24:06 Scor 10
#include <fstream>
using namespace std;
ifstream fin("immortal.in");
ofstream fout("immortal.out");
int n,m,nr,w[10000];
bool a[1000][1000];
void afis(int k){
    int i;
    for(i=1;i<k;i++)
    {
        fout<<w[i*4-3]<<" "<<w[i*4-2]<<" "<<w[i*4-1]<<" "<<w[i*4];
        fout<<'\n';
    }
}
void backtr(int k){
    int i,j;
    if(k>=nr)
    {
        afis(k);
        m=0;n=0;
    }
    else{
            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                    if(a[i][j]==1){
                        if(a[i-1][j]==1 && i-1>0){
                            if(i-2>0){
                                a[i-1][j]=0;
                                a[i][j]=0;
                                a[i-2][j]=1;
                                w[k*4]=j;
                                w[k*4-1]=i-2;
                                w[k*4-2]=j;
                                w[k*4-3]=i;
                                backtr(k+1);
                                a[i-2][j]=0;
                                a[i][j]=1;
                                a[i-1][j]=1;
                            }
                            if(i+1<=n){
                                a[i-1][j]=0;
                                a[i][j]=0;
                                a[i+1][j]=1;
                                w[k*4]=j;
                                w[k*4-1]=i+1;
                                w[k*4-2]=j;
                                w[k*4-3]=i-1;
                                backtr(k+1);
                                a[i+1][j]=0;
                                a[i][j]=1;
                                a[i-1][j]=1;
                            }
                        }
                        if(a[i][j-1]==1 && j-1>0){
                            if(j-2>0){
                                a[i][j-1]=0;
                                a[i][j]=0;
                                a[i][j-2]=1;
                                w[k*4]=j-2;
                                w[k*4-1]=i;
                                w[k*4-2]=j;
                                w[k*4-3]=i;
                                backtr(k+1);
                                a[i][j-1]=1;
                                a[i][j]=1;
                                a[i][j-2]=0;
                            }
                            if(j+1<=m){
                                a[i][j-1]=0;
                                a[i][j]=0;
                                a[i][j+1]=1;
                                w[k*4]=j+1;
                                w[k*4-1]=i;
                                w[k*4-2]=j-1;
                                w[k*4-3]=i;
                                backtr(k+1);
                                a[i][j-1]=1;
                                a[i][j]=1;
                                a[i][j+1]=0;
                            }
                        }
                    }
    }
}
int main(){
    fin>>n>>m>>nr;
    int i,x,y;
    for(i=1;i<=nr;i++)
    {
        fin>>x>>y;
        a[x][y]=1;
    }
    backtr(1);
    return 0;
}