小哼通过秘密方法得到一张不完整的钓鱼岛航拍地图。的鱼岛由一个主岛和一些附属岛
屿组成,小哼决定去钓鱼岛撩险。下面这个10* 1 0 的二维矩阵就是钓鱼岛的航拍地图。图中
数字表示海拔, 0 表示海洋, I~9 都表示陆地.小哼的飞机将会降落在(6,8)处,现在需要计
算出小哼降藩地所在岛的面积(即有多少个格子〉。注意此处我们把与小哼降落点上下左右
相链接的陆地均视为向一岛屿。
搞清楚问题之后。你会发现其实就是从(6,8)开始广度优先搜索。每次需要向上下左右四
个方向扩展,当扩展出的点大于0 时就拥入队列,直到队列扩展完毕。所有被加入到队列的
点的总数就是小岛的面积。假设地图的大小不超过50*50 . 代码实现如下。
广搜实现代码:
#include<stdio.h> struct node { int x; int y; }; int main(void) { struct node que[2501]; int head,tail; int a[51][51]; int book[51][51]={0}; int i,j,k,sum,max=0,mx,my,n,m,startx,starty,tx,ty; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; scanf("%d%d%d%d",&n,&m,&startx,&starty); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } head=1; tail=1; que[tail].x=startx; que[tail].y=starty; tail++; book[starty][starty]=1; sum=1; while(head<tail) { for(k=0;k<=3;k++) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<1||tx>n||ty<1||ty>n) continue; if(a[tx][ty]>0&&book[tx][ty]==0) { sum++; book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; tail++; } } head++; } printf("%d\n",sum); return 0; }
深搜代码如下:
#include<stdio.h> int a[51][51]; int book[51][51],n,m,sum; void dfs(int x,int y) { int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int k,tx,ty; for(k=0;k<=3;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(tx<1||tx>n||ty<1||ty>m) continue; if(a[tx][ty]>0&&book[tx][ty]==0) { sum++; book[tx][ty]=1; dfs(tx,ty); } } return ; } int main(void) { int i,j,startx,starty; scanf("%d%d%d%d",&n,&m,&startx,&starty); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } book[startx][starty]=1; sum=1; dfs(startx,starty); printf("%d\n",sum); return 0; }
时间: 2024-11-08 16:55:53