Cod sursă (job #645167)

Utilizator avatar vladdobro07 vlad dobromir vladdobro07 IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp-32 | 2,01 kb
Rundă Arhiva de probleme Status evaluat
Dată 30 mar. 2022 16:32:26 Scor 0
#include <fstream>
using namespace std;
ifstream cin("immortal.in");
ofstream cout("immortal.out");
struct nem {
    int x,y;
} v[23];
struct stck {
    int x,y,z;
} v1[23];
int a[23][23],n,m,k,i,xx,yy,j,ex=0;
int dirx[]= {-1,0,1,0},diry[]= {0,1,0,-1};
void backt(int x) {
    if(x==1) {
            for(int i=k; i>1; i--)
                cout<<v1[i].x-1<<" "<<v1[i].y-1<<" "<<v1[i].x+2*dirx[v1[i].z]-1<<" "<<v1[i].y+2*diry[v1[i].z]-1<<"\n";
        exit(0);
    }
    for(int i=0; i<=k-1; i++) {
        int l=v[i].x,c=v[i].y;
        for(int j=0; j<=3; j++) {
            int nexl=l+dirx[j],nexc=c+diry[j],nexxl=nexl+dirx[j],nexxc=nexc+diry[j];
            if(a[nexl][nexc]>-1&&a[nexxl][nexxc]==-1) {
                v1[x]= {l,c,j};
                a[l][c]=-1;
                v[i]= {nexxl,nexxc};
                a[nexxl][nexxc]=i;
                int mort=a[nexl][nexc];
                if(mort<x-1) {
                    v[mort]=v[x-1];
                    a[v[mort].x][v[mort].y]=mort;
                }
                a[nexl][nexc]=-1;
                backt(x-1);
                if(mort<x-1) {
                    v[x-1]=v[mort];
                    a[v[x-1].x][v[x-1].y]=x-1;
                    v[mort]= {nexl,nexc};
                }
                a[nexl][nexc]=mort;
                a[nexxl][nexxc]=-1;
                v[i]= {l,c};
                a[l][c]=i;
            }
        }
    }
}
int main() {
    cin>>n>>m>>k;
    for(i=2; i<=m+1; i++)
        a[0][i]=a[1][i]=a[n+2][i]=a[n+3][i]=k+1;
    for(i=2; i<=n+1; i++)
        a[i][0]=a[i][1]=a[i][m+2]=a[i][m+3]=k+1;
    for(i=2; i<=n+1; i++)
        for(j=2; j<=m+1; j++)
            a[i][j]=-1;
    for(i=1; i<=k; i++) {
        cin>>xx>>yy;
        a[xx+1][yy+1]=1;
    }
    int c=0;
    for(i=2; i<=n+1; i++)
        for(j=2; j<=m+1; j++)
            if(a[i][j]==1) {
                v[c].x=i;
                v[c].y=j;
                a[i][j]=c;
                c++;
            }
    backt(k);
    return 0;
}