[ create a new paste ] login | about

Link: http://codepad.org/AtEkOEgr    [ raw code | output | fork ]

C++, pasted on Dec 11:
#include <cstdio>
#include <cstdlib>
#include <ctime>

const int N = 10;

int islands[N][N];
int label[N][N];

void init_islands(void)
{
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			islands[i][j] = rand() % 2;
		}
	}
}

void print_islands(void)
{
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (islands[i][j]) {
				printf("■");
			} else {
				printf("□");
			}
		}
		printf("\n");
	}
}

int label_rec(int i, int j, int x)
{
	if (i < 0 || N <= i || j < 0 || N <= j) {
		return 0;
	}

	if (label[i][j] != -1) {
		return label[i][j];
	}

	if (!islands[i][j]) {
		return label[i][j] = 0;
	}

	label[i][j] = x;

	label_rec(i - 1, j, x);
	label_rec(i + 1, j, x);
	label_rec(i, j - 1, x);
	label_rec(i, j + 1, x);

	return label[i][j];
}

int count_islands(void)
{
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			label[i][j] = -1;
		}
	}

	int count = 0;

	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (label[i][j] == -1) {
				if (label_rec(i, j, count + 1)) {
					++count;
				}
			}
		}
	}

	return count;
}

int main(void)
{
	srand(static_cast<unsigned int>(time(NULL)));
	init_islands();
	
	printf("count = %d\n", count_islands());
	
	puts("--確認用--");
	print_islands();
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			printf("%3d", label[i][j]);
		}
		puts("");
	}

	return 0;
}


Output:
count = 12
--確認用--
■□■□■■□■■■
■■□■□■■□□■
■■□■■■■■□■
□□■■□□□□■■
■□■□■■■■■■
□□□□■□□■■□
□□□■■□■□□■
■□■□□■■■□□
□□□□■□□■■□
■■□□□■□■■■
  1  0  2  0  3  3  0  4  4  4
  1  1  0  3  0  3  3  0  0  4
  1  1  0  3  3  3  3  3  0  4
  0  0  3  3  0  0  0  0  4  4
  5  0  3  0  4  4  4  4  4  4
  0  0  0  0  4  0  0  4  4  0
  0  0  0  4  4  0  6  0  0  7
  8  0  9  0  0  6  6  6  0  0
  0  0  0  0 10  0  0  6  6  0
 11 11  0  0  0 12  0  6  6  6


Create a new paste based on this one


Comments: