(这竟然是有史以来最高清的卫星图片!!!!)Satellite Photographs

本文探讨了一个卫星照片分析的问题,旨在通过深度遍历算法找出照片中最大的连续牧场区域。文章详细介绍了如何使用C++实现深度优先搜索算法,并提供了一段完整的代码示例。通过对每一张图片进行逐像素的分析,算法能够识别出牧场区域,并计算其大小,最终输出最大牧场的像素数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Farmer John purchased satellite photos of W x H pixels of his farm (1 <= W <= 80, 1 <= H <= 1000) and wishes to determine the largest 'contiguous' (connected) pasture. Pastures are contiguous when any pair of pixels in a pasture can be connected by traversing adjacent vertical or horizontal pixels that are part of the pasture. (It is easy to create pastures with very strange shapes, even circles that surround other circles.) 

Each photo has been digitally enhanced to show pasture area as an asterisk ('*') and non-pasture area as a period ('.'). Here is a 10 x 5 sample satellite photo: 

..*.....** 
.**..***** 
.*...*.... 
..****.*** 
..****.*** 

This photo shows three contiguous pastures of 4, 16, and 6 pixels. Help FJ find the largest contiguous pasture in each of his satellite photos.

输入

* Line 1: Two space-separated integers: W and H 
* Lines 2..H+1: Each line contains W "*" or "." characters representing one raster line of a satellite photograph.

 

输出

* Line 1: The size of the largest contiguous field in the satellite photo.

样例输入

copy
10 5
..*.....**
.**..*****
.*...*....
..****.***
..****.***

样例输出

16
#include<iostream>
using namespace std;
char map[81][1001];
int w,h,sum=0;
void dfs(int x,int y)
{
    int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    ///next数组一定要定义在函数里面,否则会报错。。。
    if(map[x][y]=='*')
    {///找到位置
        map[x][y]='#';///标记防止重复
        sum++;
        for(int k=0;k<=3;k++)
        {///继续搜索下一个点
            int tx=x+next[k][0];
            int ty=y+next[k][1];
            dfs(tx,ty);
        }
    }
}
int main()
{
    cin>>w>>h;
    int max=0;
    for(int i=0;i<w;i++)
        cin>>map[i];///以字符串形式输入地图
    for(int i=0;i<w;i++)
    {
        for(int j=0;j<h;j++)
        {
            if(map[i][j]=='*')
            {
                sum=0;
                dfs(i,j);
                max=sum>max?sum:max;///找到最大联通区域
            }
        }
    }
    cout<<max;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值