p1923 [usaco2010_feb_bronze]FeedTime

版权声明: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;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84958959