目录
Description
一个R×S 的方格,每个人坐在一个方格中,可能存在空位。
每个人都会与自己周围的八个方格中的人握手(可能不满 8 人)。
小J 是最晚到场的,他按照如下的方式就坐:
- 若有空位,他会坐在一个能使他能与最多的人握手的空位上。
- 若没有空位,他会离开。
求出 小J 就坐后人们的握手次数。
Format
第一行两个整数R,S。
接下来一个R行S列的字符矩阵,描述就坐情况:
.
表示空位。o
表示有人入座。
仅一行一个整数,即小J就坐后人们的握手次数。
输入数据
2 3
..o
o..
输出数据
2
样例输入 #2
2 2
oo
oo
样例输出 #2
6
数据规模与约定
- 对于 20% 的数据,有 R=1。
- 对于另外 20% 的数据,有 R=2。
- 对于另外 20% 的数据,座位坐满了。
- 对于100% 的数据,有 1<= R,S<=50
分析
首先,根据题目中的“每个人都会与自己周围的八个方格中的人握手”,可以得出,每当一个新的人入座,他就会与周围每一个人握手,那么就意味着它周围八个位置(如果有的话)的握手次数都要加一(注意,是位置,不是人)。
那么,我们可以依次读入每一个数,每读入一个位置,就令它周围每一个位置的握手次数加一。
输入完毕后,我们再来扫一遍,用ans统计握手次数,用maxx统计小J握手次数,l统计当前除小J外的人数,那么明显有:如果当前位置上有人,则ans+=k[i][j]同时l++,否则,maxx=max(maxx,k[i][j]);最后,因为我们统计的是每个人的握手次数,所以ans/=2。
最后, 就行啦。
代码
#include<bits/stdc++.h>
using namespace std;
template <typename _Tp> inline void read(_Tp&x)
{
char ch;
bool flag=0;
x=0;
while(ch=getchar(),!isdigit(ch)) if(ch=='-')flag=1;
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
if(flag) x=-x;
}
inline void print(int x)
{
if(x<0)
{
x=-x;
putchar('-');
}
if(x>9)
print(x/10);
putchar(x%10+'0');
}
//快读快写,不必在意^-^
int r,s,l,p,maxx,ans;
char in;
bool g[100][100];
int k[100][100];
int main()
{
read(r);
read(s);
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
{
cin>>in;
if(in=='o')
{
l++;
g[i][j]=true;
k[i][j-1]++;
k[i][j+1]++;
k[i-1][j]++;
k[i-1][j-1]++;
k[i-1][j+1]++;
k[i+1][j]++;
k[i+1][j+1]++;
k[i+1][j-1]++;
}
}
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
{
if(g[i][j])
ans+=k[i][j];
else
maxx=max(k[i][j],maxx);
}
ans/=2;
if(r*s!=l)
ans+=maxx;
print(ans);
}