【刷题日记】小岛计数

121 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

题目描述

伽马群岛由若干小岛构成,开发者在某些小岛间修建了水上通路,使得群岛大部分连通,但也不排除部分小岛仍为孤岛,创建伽马群岛的地图,例如:

编写函数数一数该群岛共有多少个小岛。

函数接口定义:

int DFS(AMGraph G, int v);//以v为起点遍历图G(v所在的连通分量)
int  DFSTraverse(AMGraph G);//遍历图G

G为图,采用邻接矩阵存储结构,v为起点

给定的代码段

#include <stdio.h>
#include <stdlib.h>
#define MVNum 100
 
int visited[MVNum];
 
typedef struct{
    char vexs[MVNum];        //顶点向量
    int arcs[MVNum][MVNum]; //邻接矩阵
    int vexnum,arcnum;      //顶点数,边数
}AMGraph;
 
int DFS(AMGraph G, int v);//以v为起点遍历图G(v所在的连通分量)
int  DFSTraverse(AMGraph G);//遍历图G
 
int LocateVex(AMGraph G,char u)   //查询顶点u的下标
 {
   int i,count;
   for(i=0;i<G.vexnum;++i)
 if(   u==G.vexs[i]     )       return i;
   return -1;
 }
 
void CreateUDG(AMGraph &G){
    int i=0,j,count;
    char v1,v2;
     v1=getchar();
    while(v1!='#')
       {
           G.vexs[i]=v1;
           i++;
           v1=getchar();
       }
    G.vexnum=i;
       for(i = 0; i<    G.vexnum;++i)     //初始化邻接矩阵,所有元素均为0
       for(j = 0; j<    G.vexnum;++j)
         G.arcs[i][j] = 0;
       scanf("\n%c %c",&v1,&v2);
      while(v1!='#'&& v2!='#')
      {
      i = LocateVex(G, v1);
      j = LocateVex(G, v2);
      G.arcs[i][j] = 1;
      G.arcs[j][i] = 1;
      scanf("\n%c %c",&v1,&v2);
      }
  }
int main(){
    AMGraph G;
    CreateUDG(G);
    printf("%d",DFSTraverse(G));
    return 0;
}
 
/* 请在这里填写答案 */

输入格式: 第1行依次输入若干顶点的值(顶点之间无间隔),以‘#’结束(顶点不包含#) 接下来若干行输入每条边的信息,格式为:v1空格v2,直到输入‘# #’结束。

输出一个整数,为小岛数量 输入样例: ABCD# A B A C

输出样例:

4

分析

这道题属于数据结构与算法中典型的图的问题,可以用深度搜索DFS也可以用广度搜索BFS来做,我个人更喜欢深度搜索所以用了前者,下面是代码

#include <iostream>
using namespace std;
int DFS(AMGraph G, int v){
    int res = 1;
    visited[v]=true;
    for(int w=0;w<G.vexnum;w++){
        if((G.arcs[v][w]!=0)&&(!visited[w])){
            res+=DFS(G,w);
        }
    }
    return res;
}
int  DFSTraverse(AMGraph G){
    int res=0;
    for(int v=0;v<G.vexnum;++v){
        visited[v]=false;
    }
    for(int v=0;v<G.vexnum;++v){
        if(!visited[v]){
            res+=DFS(G,v);
        }
    }
    return res;
}