Pagini recente » Cod sursa (job #2858431) | Cod sursa (job #2742877) | Cod sursa (job #2959934) | Cod sursa (job #1570927) | Cod sursa (job #230901)
Cod sursa(job #230901)
#include <cstdio>
#include <cstring>
const int NMAX = 1000;
int mat[NMAX][NMAX];
bool used[NMAX * NMAX + 1];
int n, k;
void solve()
{
int rem = 0, nr = 1;
k--;
for (int i = 0; i < n; ++i)
{
int j = 0;
if (rem)
{
mat[i][j++] = rem;
rem = 0;
}
for (; j < k; j++)
{
mat[i][j] = nr++;
}
if (nr % 2)
{
rem = nr++;
mat[i][j] = nr++;
}
else
{
mat[i][j] = nr++;
}
}
for (int i = 0; i < n; ++i)
{
int j = k + 1;
if (rem)
{
mat[i][j++] = rem;
rem = 0;
}
for (; j < n; ++j)
{
mat[i][j] = nr++;
}
}
}
void print()
{
int i, j;
for (i = 0; i < n; ++i, printf ("\n"))
for (j = 0; j < n; ++j)
printf ("%d ", mat[i][j]);
}
//daca sunt distincte si sunt in intervalul 1 ... n^2
bool test1()
{
memset(used, 0, sizeof(used));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
{
if (mat[i][j] < 1 || mat[i][j] > n * n)
return false;
if (used[mat[i][j]])
return false;
used[mat[i][j]] = true;
}
return true;
}
//test daca liniile sunt in ordine crescatoare
bool test2()
{
int i, j, last;
for (i = 0; i < n; ++i)
{
last = mat[i][0];
for (j = 1; j < n; ++j)
{
if (mat[i][j] <= last)
{
return false;
}
last = mat[i][j];
}
}
return true;
}
//testez daca coloana 3 e para
bool test3()
{
int i;
for (int i = 0; i < n; ++i)
{
if (mat[i][k] % 2)
return false;
}
return true;
}
bool test()
{
bool ok = true;
if (!test1())
{
printf ("Test 1 ... failed\n");
ok = false;
}
else
{
printf ("Test 1 ... ok\n");
}
if (!test2())
{
printf ("Test 2 ... failed\n");
ok = false;
}
else
{
printf("Test 2 ... ok\n");
}
if (!test3())
{
printf ("Test 3 ... failed\n");
ok = false;
}
else
{
printf ("Test 3 ... ok\n");
}
return ok;
}
void verif()
{
while (1)
{
scanf ("%d %d", &n, &k);
if (n == 0 && k == 0)
break;
solve();
if (!test())
{
print();
break;
}
}
}
int main()
{
FILE* fin = fopen("tablete.in", "r");
fscanf (fin, "%d %d", &n, &k);
solve();
fclose(fin);
FILE *fout = fopen("tablete.out", "w");
for (int i = 0; i < n; ++i, fprintf (fout, "\n"))
for (int j = 0; j < n; ++j)
fprintf (fout, "%d ", mat[i][j]);
fclose(fout);
return 0;
}