【发布时间】:2012-08-13 14:11:40
【问题描述】:
给您一张由卫星拍摄的表面图像。该图像是一个位图,其中水标有“。”土地标有“*”。相邻的'*'组形成一个岛。 (如果两个 '*' 是水平、垂直或对角相邻的,则它们是相邻的)。你的任务是在位图中打印岛屿的数量。
示例输入:-
.........**
**......***
...........
...*.......
*........*.
*.........*
输出:- 5
这是我的实现,它占用O(r * c) 空间和O(r * c) 空间,其中 r 是总数。行数,c 是列数。
#include <stdio.h>
#define COLS 12
void markVisted(char map[][COLS], int visited[][COLS], int row, int col, int rowCount)
{
if((row < 0) || (row >= rowCount) || (col < 0) || (col >= COLS) || (map[row][col] != '*') || (visited[row][col] == 1)) return;
visited[row][col] = 1;
//calling neighbours
markVisted(map, visited, row+1, col, rowCount);
markVisted(map, visited, row, col+1, rowCount);
markVisted(map, visited, row-1, col, rowCount);
markVisted(map, visited, row, col-1, rowCount);
markVisted(map, visited, row+1, col+1, rowCount);
markVisted(map, visited, row-1, col-1, rowCount);
markVisted(map, visited, row-1, col+1, rowCount);
markVisted(map, visited, row+1, col-1, rowCount);
}
int countIslands(char map[][COLS], int visited[][COLS], int rowCount)
{
int i, j, count = 0;
for(i=0; i<rowCount; ++i){
for(j=0; j<COLS; ++j){
if((map[i][j] == '*') && (visited[i][j] == 0)){
++count;
markVisted(map, visited, i, j, rowCount);
}
}
}
return count;
}
int main()
{
char map[][COLS] = {
"*..........",
"**........*",
"...........",
"...*.......",
"*........*.",
"..........*"
};
int rows = sizeof(map)/sizeof(map[0]);
int visited[rows][COLS], i, j;
for(i=0; i<rows; ++i){
for(j=0; j<COLS; ++j) visited[i][j] = 0;
}
printf("No. of islands = %d\n", countIslands(map, visited, rows));
return 0;
}
请为这个问题提出一些更好的逻辑
此外,欢迎提出改进我的解决方案的建议。
【问题讨论】:
-
这个问题很有趣,但是通过打印源代码来描述你的算法很糟糕。您需要提供解释。
-
不过,有时候,来源是最好的文档。
-
你的算法写得很好,也足够好,没有比你更好的算法了,因为任何解决这个问题的算法都应该至少检查每个节点状态一次,并且与你的算法具有相同的顺序。
-
O (n ^ 2)你的意思是O (r * c),对吧? -
对,如果
n是您的输入大小,这实际上是O(n),因为您为每个输入单元格做一件事。
标签: c algorithm time-complexity