宝岛探险深度优先搜索(着色法)

来源:互联网 发布:手机网络劫持 编辑:程序博客网 时间:2024/05/16 09:09

写这一篇是为了上篇《ycb惹女朋友生气了》,上篇用到了着色法,下面主要介绍一下什么是用深度优先搜索实现的着色法

1.

求从起点开始连接的一整块陆地的面积,即从起点出发向四周搜索,每搜到一块陆地就加一,直到周围全是海洋,并且对陆地进行染色,即标记上负数的数字。


#include<stdio.h>#include<string.h>#include<math.h>#include<queue>using namespace std;int ch[100][100];///地图int book[100][100];///标记int n,m;///地图的行和列int start,finish;///开始位置和终止位置int sum;///记录陆地的面积int dir[4][2]={1,0,0,-1,-1,0,0,1};void dfs(int x,int y,int color){    ch[x][y]=color;    int tx,ty;    for(int i=0;i<4;i++)    {        tx=x+dir[i][0];        ty=y+dir[i][1];        if(tx<0||tx>n-1||ty<0||ty>m-1)            continue;        if(book[tx][ty]==0&&ch[tx][ty]>0)        {            book[tx][ty]=1;            dfs(tx,ty,color);        }    }}int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            scanf("%d",&ch[i][j]);        }    }                sum=1;                book[start][finish]=1;///这个点走过,避免重复记录。                dfs(start,finish,-1);    printf("%d\n",sum);}
2.如果想直到一个地图中有多少个独立的小岛,怎么做呢?

简单,只需要进行深搜,对每块陆地进行染色,就知道了,看代码:


#include<stdio.h>#include<string.h>#include<math.h>#include<queue>using namespace std;int ch[100][100];///地图int book[100][100];///标记int n,m;///地图的行和列int start,finish;///开始位置和终止位置int sum;///记录陆地的面积int dir[4][2]={1,0,0,-1,-1,0,0,1};void dfs(int x,int y,int color){    ch[x][y]=color;    int tx,ty;    for(int i=0;i<4;i++)    {        tx=x+dir[i][0];        ty=y+dir[i][1];        if(tx<0||tx>n-1||ty<0||ty>m-1)            continue;        if(book[tx][ty]==0&&ch[tx][ty]>0)        {            book[tx][ty]=1;            dfs(tx,ty,color);        }    }}int main(){    int num=0;    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            scanf("%d",&ch[i][j]);        }    }    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            if(ch[i][j]>0)            {                num--;                book[i][j]=1;                dfs(i,j,num);            }        }    }    printf("%d\n",-num);///小岛的个数,在上面两层循环中调用了多少次dfs,就有多少num。}