CCCPaste

pbinfo_1477:amplasare_cuvinte

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("cuvinte.in");
ofstream fout("cuvinte.out");

int n,m,cuv;
char c[41][31];
char mat[31][31];
int gasit=0;


int verifica(int i, int j, int dir, int nr_cuv){ // verific daca pot baga pe linia i si col j in directia dir
char cuvant[31];
strcpy(cuvant, c[nr_cuv]);
if (i+strlen(cuvant)>n && dir==1) return 0;
if (j+strlen(cuvant)>m && dir==0) return 0;
if (dir==0){
for(int k=0; k<strlen(cuvant); k++)
if (mat[i][j+k] != cuvant[k] && mat[i][j+k] != '-') return 0;
}
if (dir==1){
for(int k=0; k<strlen(cuvant); k++)
if (mat[i+k][j] != cuvant[k] && mat[i+k][j] != '-') return 0;
}
return 1;
}

void afiseaza(){
if (gasit) return;
gasit=1;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
fout << mat[i][j] << ' ';
fout << '\n';
}
}

void bkt(int nr_cuv){
if (gasit) return;
for(int dir=0; dir<=1; dir++)
for(int i=0; i<n; i++) // il pun pe linia i
for(int j=0; j<m; j++) // la coloana j
if (verifica(i,j,dir,nr_cuv)){
char copie[strlen(c[nr_cuv])+1]; // ce era in matrice acolo unde vreau sa pun cuvantul
for(int k=0; k<strlen(c[nr_cuv]); k++)
copie[k]=mat[i+k*dir][j+k*(1-dir)];
for(int k=0; k<strlen(c[nr_cuv]); k++)
mat[i+k*dir][j+k*(1-dir)]=c[nr_cuv][k];
if (nr_cuv==cuv) afiseaza();
else bkt(nr_cuv+1);
if (gasit) return;
for(int k=0; k<strlen(c[nr_cuv]); k++)
mat[i+k*dir][j+k*(1-dir)]=copie[k];
}
}

int main()
{
fin >> cuv >> n >> m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
mat[i][j]='-';

for(int i=1; i<=cuv; i++)
fin >> c[i];
bkt(1);
return 0;
}