ЗАДАЧА – Островландия
Известният мореплавател Станчо използвал своите хакерски умения и се сдобил с карта на Островландия. За съжаление обаче съкровището не било отбелязано с голям червен Х, ами просто било казано, че то се намира на най- големия остров. Картата била представена под формата на голям хексагон (правилен шестоъгълник), който е съставен от много на брой по малки хексагони. Страната на картата (големият хексагон) се състои от N хексагона. Всяка клетка в картата има стойност – нула или единица, в която нулите са вода, а единиците – суша. Съответно островите били съседни клетки от единици (като две клетки ще наричаме съседни, ако имат обща стена). Вашата задача е по дадена карта на Островландия да изведете големината на най- големия остров (в брой клетки). Най-големият остров на примера по-долу е отбелязан със зелени 1-ци.
Вход
От първия ред на стандартния вход програмата прочита едно число: 1 <= N <= 1000, представляващ броят на хексагоните стоящи на едната страна на картата. Следват 2 * N – 1 реда, всеки на който има последователности от нули и единици, описващи даден ред на картата.
Изход
На един ред на стандартния изход да се извежда едно число – големината на най-големия остров.
ПРИМЕРЕН ВХОД
5
1 0 0 1 1
1 0 1 0 1 0
1 0 0 0 1 0 1
1 0 0 0 1 1 1 0
0 1 0 1 1 0 0 1 1
0 0 0 0 0 1 1 0
1 1 0 0 0 0 0
1 1 0 1 1 0
1 0 1 0 1
ПРИМЕРЕН ИЗХОД
14
#includeusing namespace std; bool island[2000][2000]; bool visitIsland[2000][2000]; int islandLength(int row, int col, int base) { visitIsland[row][col] = 1; int length = 1; if (row > 0) { if (row <= base-1) { if (col > 0) { if (row == base-1) { if (island[row+1][col-1] == 1 && visitIsland[row+1][col-1] == 0) //dolu lqvo 1 length += islandLength(row+1, col-1, base); } if (island[row-1][col-1] == 1 && visitIsland[row-1][col-1] == 0) //gore lqvo length += islandLength(row-1, col-1, base); if (island[row][col-1] == 1 && visitIsland[row][col-1] == 0) //lqvo 1 length += islandLength(row, col-1, base); } if (col < base + row - 1) { if (row == base-1) { if(island[row+1][col] == 1 && visitIsland[row+1][col] == 0) //dolu dqsno 1 length += islandLength(row+1, col, base); } if (island[row-1][col] == 1 && visitIsland[row-1][col] == 0) //gore dqsno length += islandLength(row-1, col, base); if (island[row][col+1] == 1 && visitIsland[row][col+1] == 0) //dqsno 1 length += islandLength(row, col+1, base); } if (row < base -1) { if (island[row+1][col] == 1 && visitIsland[row+1][col] == 0) //dolu lqvo 2 length += islandLength(row+1, col, base); if (island[row+1][col+1] == 1 && visitIsland[row+1][col+1] == 0) //dolu dqsno 2 length += islandLength(row+1, col+1, base); } } else { if (island[row-1][col] == 1 && visitIsland[row-1][col] == 0) //gore lqvo 3 length += islandLength(row-1, col, base); if (island[row-1][col+1] == 1 && visitIsland[row-1][col+1] == 0) //gore dqsno 3 length += islandLength(row-1, col+1, base); if (col < 3*base - row - 3) { if (row < 2*base - 1) { if (island[row+1][col] == 1 && visitIsland[row+1][col] == 0) //dolu dqsno 2 length += islandLength(row+1, col, base); } if (island[row][col+1] == 1 && visitIsland[row][col+1] == 0) //dqsno 2 length += islandLength(row, col+1, base); } if (col > 0) { if (row < 2*base - 1) { if (island[row+1][col-1] == 1 && visitIsland[row+1][col-1] == 0) //dolu lqvo 3 length += islandLength(row+1, col-1, base); } if (island[row][col-1] == 1 && visitIsland[row][col-1] == 0) //lqvo 2 length += islandLength(row, col-1, base); } } } else { if(col > 0) { if(island[row][col-1] == 1 && visitIsland[row][col-1] == 0) //lqvo 3 length += islandLength(row, col-1, base); } if(col < base + row - 1) { if(island[row][col+1] == 1 && visitIsland[row][col+1] == 0) //dqsno 3 length += islandLength(row, col+1, base); } if (island[row+1][col] == 1 && visitIsland[row+1][col] == 0) //dolu lqvo 3 length += islandLength(row+1, col, base); if (island[row+1][col+1] == 1 && visitIsland[row+1][col+1] == 0) //dolu dqsno 3 length += islandLength(row+1, col+1, base); } return length; } int main() { int count; int lnLength; cin >> count; for (int i = 0; i < count; i++) { for (int j = 0; j < count + i; j++) { cin >> island[i][j]; visitIsland[i][j] = 0; } } for (int i = count; i < 2 * count - 1; i++) { for (int j = 0; j < 3 * count - i-2; j++) { cin >> island[i][j]; visitIsland[i][j] = 0; } } int bigest = 0; int temp; for (int i = 0; i < count; i++) { for (int j = 0; j < count + i; j++) { if (island[i][j] == 1 && visitIsland[i][j] == 0) { temp = islandLength(i,j,count); if (temp > bigest) { bigest = temp; } } } } for (int i = count; i < 2 * count - 1; i++) { for (int j = 0; j < 3 * count - i-2; j++) { if (island[i][j] == 1 && visitIsland[i][j] == 0) { temp = islandLength(i,j,count); if (temp > bigest) { bigest = temp; } } } } cout << bigest<