题目描述
时间过得真快,转眼帅学长的大学生涯就要结束了,这天全班集合来拍毕业照,但是由于帅学长早早地出去实习,甚至忘记了他的班上有几个人,现在他要通过毕业照来数班上的人数,问题来了,摄影师的水平有点差,个别同学的脸都没有入镜,只能看到那几个同学的手或者脚。一个完整的人用 https://images.ptausercontent.com/1d5e5146-efb5-4bec-8d2e-6d4e5093966a.png 来表示(头是小写字母o,两条腿中间有一个空格)。但是可以确保每位同学是至少有一个部位出现在照片里,现在帅学长要来确定班上总共有几位同学。题目保证不会出现奇怪的站姿。
样例
3 3
o
/|\
( )
C++ 代码
//#include<iostream>
#include<cstdio>
#include<string>
#include<sstream>
#include<set>
using namespace std;
/*
学习:set();
*/
string ss,aa;
set<pair<int ,int>> p;//pair可以当成是点,所以我定义了一个点的集合。
int main()
{
int m,n,i,j,ans;
char s[1000][1000];
while(~scanf("%d %d",&m,&n))
{
//把set放在里面是因为我不会set初始化,所以让他自己重新生成集合p来达到初始化的目的。
//set<pair<int ,int>> p;
for(i=0;i<m;i++)
{
getchar();
for(j=0;j<n;j++)//在这里用string无非就是加点速度。
{
scanf("%c",&s[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(s[i][j]=='o')
{
p.insert(make_pair(i,j));
}
else if(s[i][j]=='/')
{
p.insert(make_pair(i-1,j+1));
}
else if(s[i][j]=='|')
{
p.insert(make_pair(i-1,j));
}
else if(s[i][j]=='\\')// 为什么是'\\' 而不是'\'。
//答:因为\是转义字符。只有\\才代表右斜杠
{
p.insert(make_pair(i-1,j-1));
}
else if(s[i][j]=='(')
{
p.insert(make_pair(i-2,j+1));
}
else if(s[i][j]==')')
{
p.insert(make_pair(i-2,j-1));
}
}
}
ans=p.size();
printf("%d\n",ans);
p.clear();
}
return 0;
}