
Thank you very much

Moderator: Board moderators
Code: Select all
/* @JUDGE_ID: <MY_ID> 110 C */
#include <stdio.h>
#include <stdlib.h>
#define MAXV 8
#define MAXPERM 65536
#define UNDEF -1
#define DEBUG 0
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
struct comp {
int va, vb; /* compare values */
int poffs; /* offset of perms in array */
int tc, fc; /* comparsion entries for sons */
int tp, fp; /* counts of "true" and "false" perms */
} comps[MAXPERM];
struct perm {
int p[MAXV];
} perms[MAXPERM];
int V, nperms, ncomps, gap, tab, ep;
void
genperm(int depth, int *actperm, int *used)
{
int i;
if (depth == V) {
for (i = 0; i < V; i++)
perms[nperms].p[i] = actperm[i];
nperms++;
return ;
}
for (i = 0; i < V; i++)
if (!used[i]) {
used[i] = 1;
actperm[depth] = i;
genperm (depth+1, actperm, used);
used[i] = 0;
}
return ;
}
void
findcomp (int offs, int permno, int *ca, int *cb)
{
int va, vb, van, vbn, optv = 0, opta = 0, optb = 0, m;
int i, j;
for (va = 0; va < V; va++)
for (vb = 0; vb < V; vb++)
if (va != vb) {
van = 0;
vbn = 0;
for (i = 0; i < permno; i++)
{
if (MAX(van, vbn) >= permno - optv)
goto noupdate;
for (j = 0; j < V; j++)
if (perms[offs+i].p[j] == va) {
van++;
break;
} else if (perms[offs+i].p[j] == vb) {
vbn++;
break;
}
}
m = MIN(van, vbn);
if (m > optv) {
optv = m;
opta = va;
optb = vb;
}
noupdate:
}
*ca = opta;
*cb = optb;
return ;
}
int
order (struct perm *p, int a, int b)
{
int i;
for (i = 0; i < V; i++)
if (p->p[i] == a)
return 1;
else if (p->p[i] == b)
return 0;
return 0;
}
int
maketree (int offs, int permno)
{
int ca, cb, i, j, n, p;
struct perm actp;
findcomp (offs, permno, &ca, &cb);
i = 0; j = permno - 1;
n = 0;
while (i < j)
{
while (i < j && (order (&(perms[offs+i]), ca, cb)))
i++;
while (j > i && (! order (&(perms[offs+j]), ca, cb)))
j--;
if (i == j)
break;
actp = perms[offs+i];
perms[offs+i] = perms[offs+j];
perms[offs+j] = actp;
}
if (!order (&(perms[offs+i]), ca, cb))
n = i;
else
n = i+1;
#if DEBUG
if (order (&(perms[offs+n]), ca, cb) || !order (&(perms[offs+n-1]), ca, cb))
fprintf (stderr, "N (%d) counted inproperly\n", n);
if (n == 0 || n == permno)
fprintf (stderr, "Redundant comparsion \n");
#endif
comps[ncomps].va = ca;
comps[ncomps].vb = cb;
comps[ncomps].poffs = offs;
comps[ncomps].tp = n;
comps[ncomps].fp = permno - n;
comps[ncomps].tc = -1;
comps[ncomps].fc = -1;
p = ncomps;
ncomps++;
if (n > 1)
comps[p].tc = maketree (offs, n);
if (permno - n > 1)
comps[p].fc = maketree (offs + n, permno - n);
return p;
}
void
gencomptree (void)
{
int ap[MAXV], use[MAXV];
int i;
nperms = 0;
ncomps = 0;
for (i = 0; i < V; i++)
use[i] = 0;
genperm (0, ap, use);
maketree (0, nperms);
}
void
printhead (void)
{
int i;
printf ("program sort(input,output);\n");
printf ("var\n");
for (i = 0; i < V; i++)
printf("%c%c", 'a'+i, (i == V-1) ? ' ' : ',');
printf (": integer;\n");
printf ("begin\n");
for (i = 0; i < gap; i++)
printf (" ");
printf ("readln(");
for (i = 0; i < V; i++)
printf ("%c%c", 'a'+i, (i==V-1) ? ')' : ',');
printf(";\n");
}
void
parsetree (int cnode)
{
int i;
if (!ep)
for (i = 0; i < gap; i++)
printf (" ");
ep = 0;
printf ("if %c < %c then\n", comps[cnode].va+'a', comps[cnode].vb+'a');
gap += tab;
if (comps[cnode].tp == 1) {
for (i = 0; i < gap; i++)
printf (" ");
printf ("writeln(");
for (i = 0; i < V; i++)
printf ("%c%c", perms[comps[cnode].poffs].p[i]+'a', (i == V-1) ? ')' : ',');
printf ("\n");
} else {
parsetree (comps[cnode].tc);
}
gap -= tab;
for (i = 0; i < gap; i++)
printf (" ");
printf ("else");
if (comps[cnode].fp == 1) {
gap += tab;
printf ("\n");
for (i = 0; i < gap; i++)
printf (" ");
printf ("writeln(");
for (i = 0; i < V; i++)
printf ("%c%c", perms[comps[cnode].poffs + comps[cnode].tp].p[i]+'a',
(i == V-1) ? ')' : ',');
printf ("\n");
gap -= tab;
} else {
printf (" ");
ep = 1;
parsetree (comps[cnode].fc);
}
}
void
printtail (void)
{
printf ("end.\n");
}
int
main (void)
{
int i, j, k;
scanf ("%d", &k);
for (i = 0; i < k; i++)
{
if (i > 0)
printf ("\n");
scanf ("%d", &V);
gap = 2;
tab = 2;
printhead ();
if (V == 1) {
for (j = 0; j < gap; j++)
printf (" ");
printf ("writeln(a);\n");
} else {
gencomptree ();
parsetree (0);
}
printtail ();
}
return EXIT_SUCCESS;
}
Code: Select all
1
1
3
Code: Select all
program sort(input,output);
var
a : integer;
begin
readln(a);
writeln(a); { there should be no semicolon here }
end.
program sort(input,output);
var
a,b,c : integer;
begin
readln(a,b,c);
if a < b then
if a < c then
if b < c then
writeln(a,b,c)
else
writeln(a,c,b)
else
writeln(c,a,b)
else if a < c then { not correct, see problem description }
writeln(b,a,c)
else if b < c then
writeln(b,c,a)
else
writeln(c,b,a)
end.
Code: Select all
program sort(input,output);
var
a,b,c : integer;
begin
readln(a,b,c);
if a < b then
if b < c then
writeln(a,b,c)
else if a < c then
writeln(a,c,b)
else
writeln(c,a,b)
else
if a < c then
writeln(b,a,c)
else if b < c then
writeln(b,c,a)
else
writeln(c,b,a)
end.
Hope this helps.program sort(input,output);
var
a,b,c,d : integer;
begin
readln(a,b,c,d);
if a < b then
if b < c then
if c < d then
writeln(a,b,c,d)
else if b < d then
writeln(a,b,d,c)
else if a < d then
writeln(a,d,b,c)
else
writeln(d,a,b,c)
else if a < c then
if b < d then
writeln(a,c,b,d)
else if c < d then
writeln(a,c,d,b)
else if a < d then
writeln(a,d,c,b)
else
writeln(d,a,c,b)
else
if b < d then
writeln(c,a,b,d)
else if a < d then
writeln(c,a,d,b)
else if c < d then
writeln(c,d,a,b)
else
writeln(d,c,a,b)
else
if a < c then
if c < d then
writeln(b,a,c,d)
else if a < d then
writeln(b,a,d,c)
else if b < d then
writeln(b,d,a,c)
else
writeln(d,b,a,c)
else if b < c then
if a < d then
writeln(b,c,a,d)
else if c < d then
writeln(b,c,d,a)
else if b < d then
writeln(b,d,c,a)
else
writeln(d,b,c,a)
else
if a < d then
writeln(c,b,a,d)
else if b < d then
writeln(c,b,d,a)
else if c < d then
writeln(c,d,b,a)
else
writeln(d,c,b,a)
end.
Code: Select all
begin
readln(a,b,c);
if a < b then
if b < c then
writeln(a,b,c)
else if a < c then
writeln(a,c,b)
else
writeln(c,a,b)
else
if a < c then
writeln(b,a,c)
else if b < c then
writeln(b,c,a)
else
writeln(c,b,a)
end.
Code: Select all
begin
readln(a,b,c);
if a < b then
if b < c then
writeln(a,b,c)
else if a < c then
writeln(a,c,b)
else
writeln(c,a,b)
else
if a < c then
writeln(b,a,c)
else if b < c then
writeln(b,c,a)
else
writeln(c,b,a)
end.