用二维数组来表示地图,其中0表示水域,1表示土地,垂直方向和水平方向的1相连
组成一个小岛,计算给定的地图中有几个小岛解决垂直和水平问题要用到坐标数组
int x[] = {-1,1,0,0}
int y[] = {0,0,-1,1}思路:1.深度遍历:从二维数组中一个顶点开始,1表示有邻接顶点,0表示没有,深度遍历上下左右深度去找有几个图就有几个小岛。
代码如下:
void DFS(int num[4][5], int visitid[4][5], int x, int y) { static int dx[4] = { -1,1,0,0 };//坐标数组 static int dy[4] = { 0,0,-1,1 };//坐标数组 visitid[x][y] = 1;//标记 for (int i = 0; i < 4; i++) { int newx = dx[i] + x; int newy = dy[i] + y; if (newx < 0 || newx>3 || newy < 0 || newy>4)//越界 { continue; } if (visitid[newx][newy] == 0 && num[newx][newy] == 1) { DFS(num, visitid, newx, newy); } } } int main() { int num[4][5] = { {1,1,1,1,0},{0,0,1,1,1},{0,0,1,0,0},{1,1,0,0,0} }; int visitid[4][5] = { 0 }; int count = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { if (visitid[i][j] == 0 && num[i][j] == 1) { DFS(num, visitid, i, j); count++; } } } cout << count << endl; }
运行结果:
思路:2.广度遍历,建立一个存顶点类型的队列,从二维数组中的一个顶点开始入队,1表示有邻接顶点,0表示没有,将这个顶点进行标记为1表示用过,用front存对头,队列不为空则出队,找这个顶点的左右和上下是否存在邻接顶点,有几个图就有几个小岛。
代码如下:
void BFS(int num[4][5], int visited[4][5], int x, int y) { struct point { int m_x; int m_y; }; point p = { x,y }; static int dx[4] = { -1,1,0,0 }; static int dy[4] = { 0,0,-1,1 }; queue <point>qq; qq.push(p); visited[x][y] = 1; while (!qq.empty()) { p = qq.front(); x = p.m_x; y = p.m_y; qq.pop(); for (int i = 0; i < 4; i++) { int newx = dx[i] + x; int newy = dy[i] + y; if (newx < 0 || newx>3 || newy < 0 || newy>4) { continue; } if (visited[newx][newy] == 0 && num[newx][newy] == 1) { p.m_x = newx; p.m_y = newy; visited[newx][newy] = 1; qq.push(p); } } } } int main() { int num[4][5] = { {1,1,1,1,0},{0,0,1,1,1},{0,0,1,0,0},{1,1,0,0,0} }; int visitid[4][5] = { 0 }; int count = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { if (visitid[i][j] == 0 && num[i][j] == 1) { BFS(num, visitid, i, j); count++; } } } cout << count << endl; }
运行结果如下:
常见面试题:小岛问题
最新推荐文章于 2025-05-19 20:51:30 发布