Cod sursa(job #236342)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 27 decembrie 2008 11:45:06
Problema Tablete Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 2.23 kb
#include<stdio.h>
#define infile "tablete.in"
#define outfile "tablete.out"
#define nmax 1001
int m[nmax][nmax]; //matricea in care construim
int n,k; //numarul de linii/coloane, si numarul coloanei care trebuie sa aiba elementele pare
int x=0; //variabila care retine ultimul numar afisat in matrice

//functia care face matricea daca k este par
//aceasta functie pune elementele la rand pornind din coltul din stanga sus (1,1 -> nk), partea stanga a matricei
void k_par(int m[nmax][nmax], int n, int k, int *x)
	{
	int i,j;
	for(i=1;i<=n;i++) //fiecare linie
		for(j=1;j<=k;j++) //fiecare coloana pana la k
			m[i][j]=*x+=1; //ultimul numar afisat in matrice (plus 1)
	}

//functia care face matricea daca k este impar
//aceasta functie pune elementele pe rand din coltul stanga sus, avand grije ca pe coloana k sa punem numar par
void k_impar(int m[nmax][nmax], int n, int k, int *x)
	{
	int i,j;
	for(i=1;i<=n;i++) //fiecare linie
		for(j=1;j<=k;j++) //fiecare coloana
			if(j==1 && !(i%2)) //prima coloana de pe o linie para
				m[i][j]=*x-1; //afisem numarul cu 1 mai mic decat ultimul afisat in ultima coloana de pe linia anterioara
			else if(j==k && i%2) //ultima coloana de pe o linie impara
				m[i][j]=*x+=2; //afisem x+2 deoarece avem nevoie de un numar par. dupa vom afisa x-1 (primul elemeent de pe linia urmatoare)
			else m[i][j]=*x+=1; //
	}

//functia care umple cu restul numerelor ramase partea din dreapta lui k
void umplere(int m[nmax][nmax], int n, int k, int *x)
	{
	int i,j;
	for(i=1;i<=n;i++) //fiecare linie
		for(j=k+1;j<=n;j++) //coloanele din dreapta lui k
			m[i][j]=*x+=1; //unltimul numar afisat (+1)
	}

void afisare(int m[nmax][nmax], int n)
	{
	int i,j;
	for(i=1;i<=n;printf("\n"),i++)
		for(j=1;j<=n;printf("%d ",m[i][j++]));
	}

int main()
{
//deschidem fisiere
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

scanf("%d %d",&n,&k); //citim cele 2 variabile (numarul de linii/coloane si numarul coloanei ce trebuie sa aiba toate elementele pare)

if(!(k%2)) k_par(m,n,k,&x); //daca k par
else k_impar(m,n,k,&x); //k impar

umplere(m,n,k,&x); //umplem coloanele din dreapta lui k cu numerele ramase

afisare(m,n); //afisem matricea

fclose(stdin);
fclose(stdout);
return 0;
}