您的位置:首页 > 编程语言 > C语言/C++

JZOJ(中山纪中) 1985. 【普及组模拟赛】家族(family.pas/cpp)

2018-01-31 22:16 453 查看


题目:

http://blog.csdn.net/qq_35786326/article/details/79211488

题意:

求在一个岛屿上,一共有几个家族

分析:

第一次评测时,小编自信预估100,结果却是100-100。。。尬,后面重新做了一次,发现广搜比深搜好用多了,这一道题目跟小编做过的细胞问题类似(对自己广搜不自信的,可以去看下,毕竟是道模版题)。而这题小编更加推荐使用广搜,因为这样要处理的细节要比深搜少得多

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
string s[105];int len[105];
int n,head,tail,state[20001][2],dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int main()
{
freopen("family.in","r",stdin);
freopen("family.out","w",stdout);
int t=0;
scanf("%d",&n);
char z;
int j,x1,y1;
for(int i=0;i<=n;i++)
{
while(z=getchar(),z!='\n') //读入
s[i]+=z;
len[i]=s[i].size();
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<s[i].size();j++)
if(s[i][j]>='a'&&s[i][j]<='z')
{
t++;
s[i][j]='!';
state[1][0]=i;state[1][1]=j;head=0;tail=1;
do
{
head++;
for(int k=0;k<4;k++)
{
x1=state[head][0]+dx[k];y1=state[head][1]+dy[k];//广搜使用的队列
if(s[x1][y1]>='a'&&s[x1][y1]<='z'&&x1>0&&x1<=n&&y1>=0&&y1<len[x1])//当我们可以往这边走的限制条件
{
tail++;s[x1][y1]='!';//随意将已经搜到过了的s[x1][y1]赋值为一个不为小写字母(如a)的字符(如A,!)
state[tail][0]=x1;state[tail][1]=y1;//把x1,y1添加到队列中
}
}
}
while(head<tail);
}
}
printf("%d",t);
fclose(stdin);
fclose(stdout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  广搜 基础