Cod sursă (job #293093)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 1,53 kb
Rundă Arhiva de probleme Status evaluat
Dată 13 mar. 2017 10:55:04 Scor 30
#include <fstream>
#define NMax 25
#define LgMax NMax * NMax
using namespace std;
ifstream f("immortal.in"); ofstream g("immortal.out"); 
int T[NMax][NMax];
int n, m, nr, ok=1;
struct {int l, c;} P[NMax];
struct {int l,c,lll,ccc;} sol[NMax];
int dl[]={-1, 0, 1,  0}; int dc[]={ 0, 1, 0, -1};
void citire()
{f>>n>>m>>nr;
 for (int l,c,i=1; i<=nr; i++) {f>>l>>c; P[i].l=l+1; P[i].c=c+1; T[l+1][c+1]=i;}
 for (int i=0; i<n+4; i++) T[i][0]=T[i][1]=T[i][m+3]=T[i][m+2]=-1;
 for (int i=0; i<m+4; i++) T[0][i]=T[1][i]=T[n+2][i]=T[n+3][i]=-1;
}
void afisare()
{for (int i=0; i<nr-1; i++) g<<sol[i].l-1<<' '<<sol[i].c-1<<' '<<sol[i].lll-1<<' '<<sol[i].ccc-1<<'\n';
 g.close(); 
}
void bkt(int k)  //s-au desfasurat k lupte sol[0], ..., sol[k-1]
{int l, ll, lll, c, cc, ccc, aux;
 if(ok)
   if(k==nr-1) {ok=0; afisare();}
	else for (int i=1; i<=nr; ++i)
          {l=P[i].l; c=P[i].c;
		   if (T[l][c])//poate sari i?
             {for (int r=0; r<4; ++r)
			    {ll=l+dl[r]; cc=c+dc[r]; lll=l+2*dl[r]; ccc=c+2*dc[r];
				  if (T[ll][cc]>0 && T[lll][ccc]==0)
                     {//un vecin peste care poate sari
                      sol[k].l=l; sol[k].c=c; sol[k].lll=lll; sol[k].ccc=ccc; 
                      P[i].l=lll; P[i].c=ccc; T[lll][ccc]=i; T[l][c]=0; 
					  aux=T[ll][cc];  T[ll][cc]=0;
                      bkt(k+1);
                      P[i].l=l; P[i].c=c; T[l][c]=i; T[lll][ccc]=0;
                      T[ll][cc]=aux;
                     }
				}
             }
		  }
}
int main()
{citire(); bkt(0); return 0;}