版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84958959
题目
描述 Description | |||
Problem 2: FeedTime Bessie的喂食时间到了,FJ正在决定把她放在哪里。FJ的农场是由W x H (1 <= W <=750; 1 <= H <= 750)小方格组成,并被一些大小石块分割成一或多块草场。每块草场包含一些草地和石块。 Bessis 是一个多食的小奶牛,总想吃更多的草。她可以从任意一个小方格出发,向周围的纵向、横向和斜向的相邻方格移动。不过她不能移动出农场,也不想移动到石块上。Bessis想计算出她最多可以吃多少小块草。 FJ提供了他农场的地图,用字符方阵表示。 '.' 表示一块草地, '*' 表示一个石块。下面是一个10x8 的地图,可以看到有三片草地。 : ...*....** | 111*....** ...*2222** ...*....** ..**....** | 11**....** ..**2222** ..**....** ...*....** | 111*....** ...*2222** ...*....** ...**.*.** | 111**.*.** ...**2*2** ...**.*.** ***.**.*** | ***1**.*** ***.**2*** ***.**.*** ...**.*.** | 111**.*.** ...**2*2** ...**.*.** ...*.***** | 111*.***** ...*2***** ...*.***** ...***..** | 111***..** ...***..** ...***33** 草地 1 有 21格;草地 2 有18格;草地 3 有2块。因此Bessis最多一次可吃21格草。 PROBLEM NAME: feedtime |
|||
输入格式 Input Format | |||
Line 1: 两个用空格分开的整数: W 和 H * Lines 2..H+1: 第 i+1 有 W 个字符(无空格,只有'.' 或 '*'),表示地图第i行情况。 |
|||
输出格式 Output Format | |||
Line 1: 一个整数。表示Bessie一次最多可以吃多少小格草。 | |||
样例输入 Sample Input | |||
10 8 ...*....** ..**....** ...*....** ...**.*.** ***.**.*** ...**.*.** ...*.***** ...***..** |
|||
样例输出 Sample Output | |||
21 | |||
时间限制 Time Limitation | |||
1s | |||
来源 Source | |||
USACO 2010 feb bronze feedtime |
题解
本题是一道很基础的floodfill题,然而我交了十一遍才过,(—.—),哎,我好菜啊;
很简单,1.开两个方向数组,然后根据所学过得细胞问题的代码写。https://blog.csdn.net/huashuimu2003/article/details/84953510 细胞问题参考地址
2.可以A掉了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1001;
const int dx[9]={1,1,1,0,0,-1,-1,-1};
const int dy[9]={1,0,-1,1,-1,1,0,-1};//右下,下,左下,右,左,右上,上,左上
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
return num*f;
}
char a[maxn][maxn];
int ans,maxnum=-1,w,h;
void dfs(int x,int y)
{
if (a[x][y]!='*') ++ans,a[x][y]='*';
for (int i=0;i<8;++i)
{
int xx=x+dx[i],yy=y+dy[i];
if (xx>=0&&xx<h&&yy>=0&&yy<w)
if (a[xx][yy]!='*')
dfs(xx,yy);
}
}
int main()
{
int __size__ = 20 << 20; // 20MB
char *__p__ = (char*)malloc(__size__) + __size__;
__asm__("movl %0, %%esp\n" :: "r"(__p__));
w=read(),h=read();
for (int i=0;i<h;++i)
for (int j=0;j<w;++j)
cin>>a[i][j];
for (int i=0;i<h;++i)
for (int j=0;j<w;++j)
if (a[i][j]!='*')
{
dfs(i,j);
if (ans>maxnum) maxnum=ans;
ans=0;
}
printf("%d\n",maxnum);
return 0;
}