您的位置:首页 > 其它

ZOJ 5716 查找照片中人的个数 枚举

2016-04-24 15:27 239 查看
点击打开链接

/////题意:让你查找照片中存在多少个人,照片中的人的某一部位可以被覆盖

//思路:从左到右暴力枚举每一点;

//如果该点是人的某一部分就开始枚举 并标记这个人的其他部分,

//此时只需要记录刚开始有多少个不是‘.’的个数就行了

#include<bits/stdc++.h>
using namespace std;

int dy1[]={-1,0,1,-1,1};
int dx1[]={1,1,1,2,2};
int dy2[]={1,2,0,2};
int dx2[]={0,0,1,1};
int dy3[]={1,-1,1};
int dx3[]={0,1,1};
int dy4[]={-2,0};
int dx4[]={1,1};
int dy5[]={2};
int dx5[]={0};
char s[1000][1000];
int vis[1000][1000];
int n,m;
int judge(int fx,int fy)
{
if(fx<0||fx>=n||fy<0||fy>=m)
return 1;
return 0;
}
int main()
{
char biao[]={'/','|','\\','(',')'};

int T;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
int num=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='.')
continue;

num++;
if(s[i][j]=='O')
{
for(int k=0;k<5;k++)
{

int fx=i+dx1[k];
int fy=j+dy1[k];
if(judge(fx,fy))
continue;

if(biao[k]==s[fx][fy])
{

s[fx][fy]='.';
}
}
}
else if(s[i][j]=='/')
{
for(int k=0;k<4;k++)
{
int fx=i+dx2[k];
int fy=j+dy2[k];
if(judge(fx,fy))
continue;
if(biao[k+1]==s[fx][fy])
{
s[fx][fy]='.';
}
}
}
else if(s[i][j]=='|')
{
for(int k=0;k<3;k++)
{
int fx=i+dx3[k];
int fy=j+dy3[k];
if(judge(fx,fy))
continue;
if(biao[k+2]==s[fx][fy])
{
s[fx][fy]='.';
}
}
}
else if(s[i][j]=='\\')
{
for(int k=0;k<2;k++)
{
int fx=i+dx4[k];
int fy=j+dy4[k];
if(judge(fx,fy))
continue;
if(biao[k+3]==s[fx][fy])
{
s[fx][fy]='.';
}
}
}
else if(s[i][j]=='(')
{
for(int k=0;k<1;k++)
{
int fx=i+dx5[k];
int fy=j+dy5[k];
if(judge(fx,fy))
continue;
if(biao[k+4]==s[fx][fy])
{
s[fx][fy]='.';
}
}
}
s[i][j]='.';

}
}
printf("%d\n",num);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: