Σελίδα 1 από 3
Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 3:39 pm
από kernelpanic
'Οποιος θέλει ποστάρει τη λύση του εδώ, σχολιάζει τις άλλες, περιγράφει γλαφυρά τα πλεονεκτήματα του αλγορίθμου του

, κλπ.
Αρχίζω:
Κώδικας: Επιλογή όλων
/*LANG:C++
TASK: Alexander*/
#include<fstream>
#include <stdlib.h>
using namespace std;
int main(){
register short int line,col,cl,cc;
register char s1='P',s2='V',pvpv='\0',*point,*point2,*line1,*line2;
char check;
ifstream inpy("Alexander.in");
ofstream outy("Alexander.out");
inpy >> line >> col >> check;
inpy.close();
if(check=='V')pvpv++;
line1=(char*)malloc((col+2);
if((line1==NULL)) return 0;
line2=(char*)malloc((col+2);
if((line2==NULL)) return 0;
point=line1;
point2=line2;
for(cc=0;cc<col;cc++)
{if(pvpv%2){*point=s2;*point2=s1;}else{*point=s1;*point2=s2;}
point++;
point2++;
pvpv++;}
*point='\n';
*point2='\n';
point++;
point2++;
*point='\0';
*point2='\0';
pvpv='\0';
for(cl=0;cl<line;cl++)
{if(pvpv%2){outy<<line2;}else{outy<<line1;}
pvpv++;}
outy.close();
return 0;}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 3:44 pm
από chris
Να και ο δικός μου κώδικας!
Είναι αργός, αλλά αυτόν υπέβαλλα!
- Spoiler: show
- /*
LANG: C
TASK: Alexander
*/
#include <stdio.h>
int main (void)
{
FILE *in;
FILE *out;
int L = 0, C = 0, i, j;
char fchar, pchars[2], temp;
in=fopen("Alexander.in", "r");
fscanf(in,"%d %d\n%c", &L, &C, &fchar);
fclose(in);
if (fchar=='V')pchars[0]='V', pchars[1]='P' ;
else pchars[0]='P', pchars [1]='V';
pchars[2]='\0';
out=fopen("Alexander.out", "w");
for(i=0;i<L;i++){
for(j=0;j<(C/2);j++){
fprintf(out,"%s",pchars);
}
if (C%2==1) fprintf(out,"%c",fchar);
fprintf(out,"\n");
temp=pchars[0];
pchars[0]=pchars[1];
pchars[1]=temp;
}
return 0;
}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 6:00 pm
από kernelpanic
Μια χαρά είναι
Η μόνη μου ένσταση:
if (C%2==1)
Το %2 ή 0 θα είναι ή 1, και κάθε αριθμός άνισος του 0 είναι αληθής, οπότε δε χρειάζεσαι το ==1
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 7:42 pm
από dimitris
Να σε πω κάτι kernelpanic; Αν έγραψες τον κώδικά σου στην μορφή που τον γράφεις εδώ ατράνταχτα πιστεύω ότι δεν κάνεις για προγραμματιστής ελεύθερου λογισμικού

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 7:44 pm
από dimitris
Όσο για σένα chris πιστεύω ότι καλύτερο θα ήταν να μην χρησιμοποιούσες πίνακες αλλά κατευθείαν να τύπωνες τους χαρακτήρες στο αρχείο.
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 7:48 pm
από compileGuy
Να και η δικιά μου λύση!!
- Spoiler: show
- /*
LANG: C++
TASK: Alexander
*/
#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
ofstream TextOut;
ifstream TextIn;
int C;
int L;
char PStype,*array;
int i,j,k;
string strP1,strP2,strP3;
TextIn.open ("Alexander.in");
TextIn >>L>>C>>PStype;
TextIn.close();
if (L>=10 && L<=10000 && C>=10 && C<=12000 && PStype=='P' || PStype=='V')
{
if (fmod(C,2)==0)
{
for (i=0; i<C/2; i++)
{
strP1+="PV";
}
for (j=0; j<C/2; j++)
{
strP2+="VP";
}
strP1+="\n";
strP2+="\n";
}
else
{
for (i=0; i<(C-1)/2; i++)
{
strP1+="PV";
}
strP1+="P";
strP1+="\n";
for (j=0; j<(C-1)/2; j++)
{
strP2+="VP";
}
strP2+="V";
strP2+="\n";
}
if (fmod(L,2)==0)
{
if (PStype=='P')
{
for (k=0; k<L/2; k++)
{
strP3+=strP1;
strP3+=strP2;
}
}
else
{
for (k=0; k<L/2; k++)
{
strP3+=strP2;
strP3+=strP1;
}
}
}
else
{
if (PStype=='P')
{
for (k=0; k<(L-1)/2; k++)
{
strP3+=strP1;
strP3+=strP2;
}
strP3+=strP1;
}
else
{
for (k=0; k<(L-1)/2; k++)
{
strP3+=strP2;
strP3+=strP1;
}
strP3+=strP2;
}
}
array = new char [strP3.size()+1];
strcpy (array, strP3.c_str());
TextOut.open ("Alexander.out");
TextOut.write (array,L*C+L);
TextOut.close();
}
else
{
std::cout <<"Wrong Input";
}
return 0;
}
Τί λέτε!? Είμαι απαισιόδοξος για το αποτέλεσμα!!

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 8:11 pm
από thelastnicholas
Και η δικιά μου...
Κώδικας: Επιλογή όλων
#include <cstdio>
int main(){
int L,C;
char line[2][12001]={0};
FILE *IN =fopen("Alexander.in","r");
FILE *OUT =fopen("Alexander.out","w");
fscanf(IN,"%d %d %c",&L,&C,&line[0][0]);
fclose(IN);
if(line[0][0]=='P') line[1][0]='V';
else line[1][0]='P';
for(int i=1;i<C;i++){
line[0][i]=line[1][i-1];
line[1][i]=line[0][i-1];
}
line[0][C] = line[1][C] = '\n';
for(int i=0;i<(int)(L/2);i++){
fwrite(line[0],C+1,sizeof(char),OUT);
fwrite(line[1],C+1,sizeof(char),OUT);
}
if(L%2)
fwrite(line[0],C+1,sizeof(char),OUT);
fclose(OUT);
return 0;
}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 8:17 pm
από kernelpanic
@dimitris:
1)Γιατί καλέ;
2)Πίστεψέ με, δε θες, τα συγκρινα (L*C και L) και το πρώτο πηγαίνει πολύ, πολύ πιο αργά.
@compile:
Μη φτιάχνεις διαφορετική έκδοση για κάθε εκδοχή. Δε θα τους αρέσει νομίζω.
Το if στην αρχή δε δουλέυει σωστά καί δε χρειάζεται, το PStype=='P' || PStype=='V' πρέπει να το βάλεις σε παρένθεση.
Βγάλε όλα τα περιττά, δε σου χρειάζονται.
Έχω ακούσει φήμες ότι οι μεγάλες μεταβλητές είναι κακές
Απ'την άλλη, μπράβο στη χρήση του new, εγώ δε μπορούσα να το χρησιμοποιήσω και έβαλα malloc
Για να σταματήσω να σε ροκανίζω, πολύ καλή δουλειά! Μπράβο!

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:10 pm
από userresu
kernelpanic έγραψε:@dimitris:
1)Γιατί καλέ;
Μάλλον εννοεί ότι ο κώδικάς σου είναι δύσκολο να διαβαστεί

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:23 pm
από kernelpanic
Εμένα;;; Πώς σου ήρθε;

Πάντως μου πήρε ώρα να καταλάβω πλήρως το πρόγραμμα του Compile

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:26 pm
από georgeha98
Μέχρι τώρα νομίζω ότι ο thelastnicholas έχει την καλύτερη λύση - αν και θα μπορούσε λίγο καλύτερη, σε αυτό το μοτίβο - αλλά αν είναι να ποστάρουμε καλύτερα να μας δείξει κάποιος μια λύση που αξίζει.
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:37 pm
από userresu
georgeha, είσαι γεννημένος το 98;

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:39 pm
από kernelpanic
Το παιδί θαύμα

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:40 pm
από stathis
Ως τώρα πρέπει να 'ναι του thelastnicholas η καλύτερη λύση, όντως.
Αν και με χαλάνε τα "sizeof" που κάνει εκεί, χάνει κάποια ms, μπορούσε να μη τα κάνει καθόλου και να βάλει 1, ή απλά να καλέσει μόνο μια φορά το sizeof, αντί για L.
Κώδικας: Επιλογή όλων
#include <stdio.h>
int main(void)
{
int i=0, j=0, L, C, Last=1;
char c, s1[65536], s2[65536];
FILE *fin = fopen("Alexander.in", "r");
fscanf(fin, "%d %d\n%c", &L, &C, &c);
fclose(fin);
s1[0] = 'P'; s2[0] = 'V';
for (i=1;i<C;i++) {
if (Last==1) {
s1[i] = 'V';
s2[i] = 'P';
Last = 2;
} else
if (Last==2) {
s1[i] = 'P';
s2[i] = 'V';
Last = 1;
}
j = i+1;
}
s1[j] = '\n'; s2[j] = '\n';
if (c=='P') Last = 1; if (c=='V') Last = 2;
FILE *fout = fopen("Alexander.out", "w");
for (i=1;i<=L;i++) {
if (Last==1) {
Last = 2;
fwrite(s1, 1, C+1, fout);
} else
if (Last==2) {
Last = 1;
fwrite(s2, 1, C+1, fout);
}
}
fclose(fout);
return 0;
}
Τώρα, όσον αφορά τα τεράστια arrays, είχα προβλήματα με 12001, ακόμη και 20000.
Στο τέλος κάθε γραμμής μου πετούσε καμιά δεκάδα random ψηφία απ' τον πίνακα ASCII.
Οπότε το έβαλα σε ένα ψηλό αριθμό και ξένοιασα.
Και ναι, είναι η πρώτη μου υλοποίηση, γι' αυτό είναι τόσο χάλια, don't ask.

Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 9:56 pm
από georgeha98
userresu έγραψε:georgeha, είσαι γεννημένος το 98;

- Spoiler: show
- Ναι είμαι 10 χρονών, και έχω σκοπό πριν τελειώσω το δημοτικό να έχω κερδίσει μια δυο φορές την Ολυμπιάδα..
Τυχαίο είναι το 98, απλά είχα φτιάξει το msn μου το '98 και επειδή δεν μπορούσα να βρω διαθέσιμο username, διάλεξα αυτό και εχει μείνει από τότε.
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 10:35 pm
από bour1992
Αυτός είναι και ο δικός μου κώδικας.
Κώδικας: Επιλογή όλων
/*
LANG: C++
TASK: Alexander
*/
#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main()
{
ifstream inf("Alexander.in");
ofstream ouf("Alexander.out");
int num, num2, CountHeight=0, CountWidth=0;
char char1;
if (inf >> num >> num2)
{
if (inf >> char1)
{
if ((num>=10) && (num<=10000) && (num2>=10) && (num2<=12000))
{
if (char1 == 'P')
{
for (;;)
{
for (;;)
{
ouf << char1;
CountWidth++;
if (CountWidth>=num2)
break;
ouf << "V";
CountWidth++;
if (CountWidth>=num2)
break;
}
ouf << "\n";
CountWidth=0;
CountHeight++;
if (CountHeight>=num)
break;
for (;;)
{
ouf << "V";
CountWidth++;
if (CountWidth>=num2)
break;
ouf << char1;
CountWidth++;
if (CountWidth>=num2)
break;
}
ouf << "\n";
CountWidth=0;
CountHeight++;
if (CountHeight>=num)
break;
}
}
if (char1 == 'V')
{
for (;;)
{
for (;;)
{
ouf << char1;
CountWidth++;
if (CountWidth>=num2)
break;
ouf << "P";
CountWidth++;
if (CountWidth>=num2)
break;
}
ouf << "\n";
CountWidth=0;
CountHeight++;
if (CountHeight>=num)
break;
for (;;)
{
ouf << "P";
CountWidth++;
if (CountWidth>=num2)
break;
ouf << char1;
CountWidth++;
if (CountWidth>=num2)
break;
}
ouf << "\n";
CountWidth=0;
CountHeight++;
if (CountHeight>=num)
break;
}
}
}
inf.close();
return (0);
}
}
}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Παρ Φεβ 13, 2009 11:46 pm
από hambos
Τσιμπήστε και το δικό μου
- Spoiler: show
- #include <iostream>
#include <fstream>
using namespace std;
void toggle(char & c);
bool check_xy(int x, int y);
int main()
{
cout << "To pshfidwto tou M.Alexandrou (by Poulikidhs Haralampos)" << endl;
cout << "Hit enter to continue...";
cin.get();
int x,y;
char c;
ifstream fin;
ofstream fout;
fin.open("Alexander.in");
fin >> x >> y >> c;
fin.close();
if (!check_xy(x,y))
{
cout << "prosexe ti x,y dineis...";
cout << "Hit enter to continue...";
cin.get();
return 0;
}
fout.open("Alexander.out");
for (int i =0; i<x; i++)
{
for (int j=0; j<y; j++)
{
fout << c;
toggle(c);
}
fout << endl;
if (x%2==0) toggle(c);
}
fout.close();
return 0;
}
void toggle(char & c)
{
if (c=='P')c='V';
else c='P';
return;
}
bool check_xy(int x, int y)
{
if (x<10 || x>10000) return false;
if (y<10 || y>12000) return false;
return true;
}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Σάβ Φεβ 14, 2009 2:11 am
από c13
και η δικιά μου λύση σε c
Κώδικας: Επιλογή όλων
#include<stdio.h>
int main() {
FILE *f;
int L, C, i, b;
char E, E2;
f=fopen("Alexander.in.txt", "r");
fscanf(f,"%d %d", &L, &C);
fscanf(f,"%s", &E);
fclose(f);
f=fopen("Alexander.out.txt", "w");
E2 = (E == 'P') ? 'V' : 'P';
for(i = 1; i <= L; i++) {
for(b = 1; b <= C; b++)
fprintf(f, "%c", (i+b) & 1 ? E2 : E);
fprintf(f, "\n");
}
fclose(f);
return 0;
}
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Σάβ Φεβ 14, 2009 11:00 am
από kernelpanic
@hambos:
Ελπίζω να έβγαλες τα cin όταν το υπέβαλες...
@c13:

Κατάληξη txt ;!
Re: Λύσεις της Α Φασης!
Δημοσιεύτηκε: Σάβ Φεβ 14, 2009 12:23 pm
από Thrasos
πφφ πολύ C έπεσε... ήρθε η ώρα για λίγο Pascal
έδωσα μια πολύ απλή λύση τελικά γιατί δεν προλαβαίνω τπτ με τα μαθήματα
η πολυπλοκότητα είναι τετραγωνική στην χειρότερη περίπτωση (μπορεί να γίνει πολύ εύκολα γραμμική......).
Κώδικας: Επιλογή όλων
program Alexander;
(*LANG: Pascal
TASK: Alexander*)
uses
sysutils;
var
input,
output:text;
Diastaseis: string;
ArxikhPsifida,DeyterhPsifida,
i:char;
count,count2,
Sthles,grammes:integer;
begin
assign(input,'Alexander.in');
reset(input);
Readln(input,Diastaseis);
read(input,ArxikhPsifida);
close(input);
DeyterhPsifida:= 'V';
if ArxikhPsifida = 'V' then DeyterhPsifida := 'P';
count:=0 ;
repeat
count:=count+1;
i:=Diastaseis[count]
until i= ' ';
grammes:= StrtoInt(Copy(Diastaseis,1,count-1)) ;
sthles:= StrtoInt(Copy(Diastaseis,count+1,Length(DIastaseis)-count));
Assign(output,'Alexander.out');
Rewrite(output);
for count2 := 1 to grammes do
begin
if count2 mod 2 =1 then
for count := 1 to sthles do
if count mod 2 =1 then
write(output,ArxikhPsifida)
else
write(output,DeyterhPsifida)
else
for count := 1 to sthles do
if count mod 2 =1 then
write(output,DeyterhPsifida)
else
write(output,ArxikhPsifida) ;
writeln(Output) ;
end;
close(output);
readln;
end.