Островландия


ЗАДАЧА – Островландия

Известният мореплавател Станчо използвал своите хакерски умения и се сдобил с карта на Островландия. За съжаление обаче съкровището не било отбелязано с голям червен Х, ами просто било казано, че то се намира на най- големия остров. Картата била представена под формата на голям хексагон (правилен шестоъгълник), който е съставен от много на брой по малки хексагони. Страната на картата (големият хексагон) се състои от 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

#include 
using 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<
          
  1. Няма коментари.
(will not be published)