| Task: | Tontti |
| Sender: | hello_world |
| Submission time: | 2015-10-01 19:09:16 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | 0 |
| subtask | verdict | score |
|---|---|---|
| #1 | WRONG ANSWER | 0 |
| #2 | WRONG ANSWER | 0 |
| #3 | WRONG ANSWER | 0 |
| test | verdict | time | subtask | |
|---|---|---|---|---|
| #1 | WRONG ANSWER | 0.05 s | 1 | details |
| #2 | WRONG ANSWER | 0.05 s | 1 | details |
| #3 | WRONG ANSWER | 0.05 s | 1 | details |
| #4 | WRONG ANSWER | 0.05 s | 1 | details |
| #5 | WRONG ANSWER | 0.05 s | 1 | details |
| #6 | WRONG ANSWER | 0.05 s | 2 | details |
| #7 | WRONG ANSWER | 0.06 s | 2 | details |
| #8 | WRONG ANSWER | 0.06 s | 2 | details |
| #9 | WRONG ANSWER | 0.06 s | 2 | details |
| #10 | WRONG ANSWER | 0.06 s | 2 | details |
| #11 | WRONG ANSWER | 0.08 s | 3 | details |
| #12 | WRONG ANSWER | 0.08 s | 3 | details |
| #13 | WRONG ANSWER | 0.12 s | 3 | details |
| #14 | WRONG ANSWER | 0.13 s | 3 | details |
| #15 | WRONG ANSWER | 0.14 s | 3 | details |
Compiler report
input/code.cpp: In function 'int main()':
input/code.cpp:48:15: warning: unused variable 'lines' [-Wunused-variable]
unsigned int lines = 0; //montako lineä on muistissa
^
input/code.cpp:62:31: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
fgets(char_line, len, stdin);
^Code
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct Line{
unsigned int *trees_x; //listaa puiden määrän x-suunnassa
unsigned int *trees_y; //listaa puiden määrän y-suunnassa
unsigned int *r; //matka edelliseen puuhun, joko y-tai x-suunnassa
Line *next;
Line *last;
bool *isTree;
};
void printTreesX(Line *ap, unsigned int w);
void printTreesY(Line *ap, unsigned int w);
void printIsTree(Line *ap, unsigned int w);
void printR(Line *ap, unsigned int w);
int main(void){
unsigned int h, w, x; //korkeus, leveys, puiden määrä aluetta kohti
cin >> h; //korkes
cin >> w; //leveys
cin >> x; //puita / alue (voi olla myös nolla, ota se huomioon)
Line *a = (Line *)malloc(sizeof(Line));
a->next = NULL;
a->last = NULL;
a->trees_x = (unsigned int *)malloc(sizeof(unsigned int) * w);
a->trees_y = (unsigned int *)malloc(sizeof(unsigned int) * w);
a->r = (unsigned int *)malloc(sizeof(unsigned int) * w);
a->isTree = (bool *)malloc(sizeof(bool) * w);
//tämä sisältää pointerit lineihin, jotta ei pidä aina välttämättä toimia ->last:n ja next->n avulla
//Line *pointersToLines[h];
unsigned int v = w;
while(v--) {
a->r[v] = 0; //ensimmäisellä rivillä ei ole lähintä matkaa ('oikea yläkulma'), vaan se on aina nolla, sillä lähimmästä matkasta mitataan kuinka paljon pitää kasvattaa kokoa
//a->trees_y[v] = 0; //myöskään ensimmäisen rivin yläpuolella ei ole puita
}
Line *ap = a;
unsigned int lines = 0; //montako lineä on muistissa
unsigned int len = w + 1;
char *char_line = (char*)malloc(sizeof(unsigned int) * len);
if (!feof(stdin)) fgetc(stdin);
unsigned int i = h;
while(i--) {
//huomioi, että myös pontersToLines on +:sta -:s suuntaan menevä, kuten lähes kaikki muukin tässä ohjelmassa
//pointersToLines[i] = ap;
cout << "i:" << i << " " << char_line << endl;
fgets(char_line, len, stdin);
fgetc(stdin);
//katsotaan montako puuta uudella linellä oli, muodostetaan uusi Line
unsigned int j = w;
unsigned int tree_count = 0;
while(j--){
if (char_line[j] == '*') {
tree_count++; //lisätään puiden määrää x-suunnassa yhdellä, nopeampi tehdä counterilla kuin samalla tyylillä kuin y:n
ap->isTree[j] = true;
if (ap->last != NULL) ap->trees_y[j] = (ap->last)->trees_y[j] + 1; //puiden määrä y-suunnassa lisääntyy yhdellä
else ap->trees_y[j] = 1;
} else {
ap->isTree[j] = false; //ei toimi
if (ap->last != NULL) {
ap->trees_y[j] = (ap->last)->trees_y[j]; //puiden määrä y-suunnassa pysyy samana
}else ap->trees_y[j] = 0;
}
ap->trees_x[j] = tree_count; //rivin alkiosta[ind] rivin loppuun olevien puiden määrä
if (j < w - 1){ //j > 0, ei ole ensimmäinen alkio
if (ap->last != NULL){ //ei ole ensimmäinen rivi
if ((ap->last)->isTree[j]) ap->r[j] = 1; //puu suoraan yläpuolella, joudutaan kasvattamaan kokoa yhdellä jos halutaan saada puu
else if (ap->isTree[j + 1]) ap->r[j] = 1; //puu sivulla joudutaan kasvattamaan kokoa yhdellä, jos halutaan saada puu
else if ((ap->last)->isTree[j + 1]) ap->r[j] = 1;
else {
unsigned int m = min((ap->last)->r[j], ap->r[j + 1]);
if ((ap->last)->r[j] != 0 || ap->r[j + 1] != 0) ap->r[j] = m + 1; //ei ole aivan puun vieressä, joten etäisyyttä puuhun kasvatetaan yhdellä, kasvatettavaa matkaa lisätään yhdellä
else ap->r[j] = m; //jos molemmat y+1 ja x+1 matkat ovat 0, niin myös tämän matka on nolla, muutoin ... +1
}
}
} else ap->r[j] = 0;
}
//lasketaan neliöt
/*unsigned int v = w;
cout << "a->";
while(v--){
cout << ap->trees[v] << " " << endl;
}*/
//katsotaan onko lines tarpeeksi suuri, jotta voidaan alkaa muodostamaan neliön muotoisia
if (i) { //muodostetaan uusi line, mikäli tarvetta, eli linejen ottamista jatketaan vielä
ap->next = (Line *)malloc(sizeof(Line));
(ap->next)->last = ap;
ap = ap->next;
ap->trees_x = (unsigned int *)malloc(sizeof(unsigned int) * w);
ap->trees_y = (unsigned int *)malloc(sizeof(unsigned int) * w);
ap->r = (unsigned int *)malloc(sizeof(unsigned int) * w);
ap->isTree = (bool *)malloc(sizeof(bool) * w);
}
//nyt on uusi line jälleen alustettu(ja kenties vanha poistettu)
}
//nyt on kaikki linet tallessa
//cout << endl; printTreesX(ap, w);
//cout << endl; printTreesY(ap, w);
//cout << endl; printIsTree(ap, w);
//cout << endl; printR(ap, w);
//määritetään kullekin ruudulle pienin mahdollinen neliön koko, eli että alkaa tulemaan puita
/*
//saadaan selville kuinka paljon kokoa on minimissään suurennettava, löydetään puita
selataan rivi kerrallaan:
rivi1: alustetaan nollaksi
muut rivit:
-jokaisen rivin ensimmäinen alkio on nolla
-jokainen alkio on yhden suurempi kuin pienempi kahdesta seuraavasta on
-edellisen rivin saman x:n omaava alkio(last, x)
-current rivin edellisen y:n omaava alkio(cur, x - 1)
*/
/*
1.nyt on selvillä jokaisen rivin jokaisen alkion matka(x tai y)
lähimpään 'mustaan' alkioon
2.lasketaan kuinka monta puuta on alueella (size = matka)
*jos alueella on liian vähän puita:
-tarkistetaan kuinka paljon alueen kokoa pitää vielä lisätä
*etsitään yläreunaa ja vasenta sivua kiertämällä pienimmän matkan
omaava alkio, min(matka, line->matka)
*/
free(char_line);
//free(pointersToLines);
return 0;
}
void printTreesX(Line *ap, unsigned int w){
Line *l = ap;
while(l != NULL) {
unsigned int w2 = w;
cout << "line: ";
while (w2--){
cout << l->trees_x[w2] << " ";
} cout << endl;
l = l->last;
cin.get();
}
}
void printTreesY(Line *ap, unsigned int w){
Line *l = ap;
while(l != NULL) {
unsigned int w2 = w;
cout << "line: ";
while (w2--){
cout << l->trees_y[w2] << " ";
} cout << endl;
l = l->last;
cin.get();
}
}
void printIsTree(Line *ap, unsigned int w){
Line *l = ap;
while(l != NULL) {
unsigned int w2 = w;
cout << "line: ";
while (w2--){
cout << l->isTree[w2] << " ";
} cout << endl;
l = l->last;
cin.get();
}
}
void printR(Line *ap, unsigned int w){
Line *l = ap;
while(l != NULL) {
unsigned int w2 = w;
cout << "line: ";
while (w2--){
cout << l->r[w2] << " ";
} cout << endl;
l = l->last;
cin.get();
}
}
void freeMemory(Line *line){
Line *l;
do {
l = line;
line = line->last;
free(l->trees_x);
free(l->trees_y);
free(l);
} while(line->last != NULL);
}
Test details
Test 1
Subtask: 1
Verdict: WRONG ANSWER
| input |
|---|
| 10 10 1 ......*... .......*.. *..*....*. *....*.... ... |
| correct output |
|---|
| 94 |
| user output |
|---|
| i:9 i:8 ......*... i:7 .......*.. i:6 *..*....*. i:5 *....*.... ... |
Test 2
Subtask: 1
Verdict: WRONG ANSWER
| input |
|---|
| 10 10 5 ********** ********** ********** ********** ... |
| correct output |
|---|
| 0 |
| user output |
|---|
| i:9 i:8 ********** i:7 ********** i:6 ********** i:5 ********** ... |
Test 3
Subtask: 1
Verdict: WRONG ANSWER
| input |
|---|
| 10 10 10 **...*...* *..*.**.*. ...**.*..* *...**.*.. ... |
| correct output |
|---|
| 4 |
| user output |
|---|
| i:9 i:8 **...*...* i:7 *..*.**.*. i:6 ...**.*..* i:5 *...**.*.. ... |
Test 4
Subtask: 1
Verdict: WRONG ANSWER
| input |
|---|
| 10 10 5 ****...... *.*.**..** ....*.*..* ...*.***.. ... |
| correct output |
|---|
| 16 |
| user output |
|---|
| i:9 i:8 ****...... i:7 *.*.**..** i:6 ....*.*..* i:5 ...*.***.. ... |
Test 5
Subtask: 1
Verdict: WRONG ANSWER
| input |
|---|
| 10 10 2 **.***..*. ...*.*.... .***.*...* ***.***..* ... |
| correct output |
|---|
| 30 |
| user output |
|---|
| i:9 i:8 **.***..*. i:7 ...*.*.... i:6 .***.*...* i:5 ***.***..* ... |
Test 6
Subtask: 2
Verdict: WRONG ANSWER
| input |
|---|
| 500 500 1 ................................. |
| correct output |
|---|
| 9552040 |
| user output |
|---|
| i:499 i:498 ........................... |
Test 7
Subtask: 2
Verdict: WRONG ANSWER
| input |
|---|
| 500 500 5 ................................. |
| correct output |
|---|
| 1536063 |
| user output |
|---|
| i:499 i:498 ........................... |
Test 8
Subtask: 2
Verdict: WRONG ANSWER
| input |
|---|
| 500 500 25000 **...*...**..*.*..*.**.*..*.*.... |
| correct output |
|---|
| 288 |
| user output |
|---|
| i:499 i:498 **...*...**..*.*..*.**.*... |
Test 9
Subtask: 2
Verdict: WRONG ANSWER
| input |
|---|
| 500 500 12500 **.**.*..*...*.**...*.***........ |
| correct output |
|---|
| 786 |
| user output |
|---|
| i:499 i:498 **.**.*..*...*.**...*.**... |
Test 10
Subtask: 2
Verdict: WRONG ANSWER
| input |
|---|
| 500 500 5000 .*.*.**..*.*.**.**..*..**...*.... |
| correct output |
|---|
| 1763 |
| user output |
|---|
| i:499 i:498 .*.*.**..*.*.**.**..*..*... |
Test 11
Subtask: 3
Verdict: WRONG ANSWER
| input |
|---|
| 2000 2000 1 ................................. |
| correct output |
|---|
| 489611392 |
| user output |
|---|
| i:1999 i:1998 .......................... |
Test 12
Subtask: 3
Verdict: WRONG ANSWER
| input |
|---|
| 2000 2000 5 ................................. |
| correct output |
|---|
| 120725884 |
| user output |
|---|
| i:1999 i:1998 .......................... |
Test 13
Subtask: 3
Verdict: WRONG ANSWER
| input |
|---|
| 2000 2000 400000 ..*..**.**.**.*.***...**.*..**... |
| correct output |
|---|
| 1849 |
| user output |
|---|
| i:1999 i:1998 ..*..**.**.**.*.***...*... |
Test 14
Subtask: 3
Verdict: WRONG ANSWER
| input |
|---|
| 2000 2000 200000 ***.*....*.*..*....**..*..*.*.... |
| correct output |
|---|
| 2665 |
| user output |
|---|
| i:1999 i:1998 ***.*....*.*..*....**..... |
Test 15
Subtask: 3
Verdict: WRONG ANSWER
| input |
|---|
| 2000 2000 80000 **.**...*.***.**....**.*....*.... |
| correct output |
|---|
| 5587 |
| user output |
|---|
| i:1999 i:1998 **.**...*.***.**....**.... |
