由于格子比较少,且只有两次机会,可以直接扫描每个格子周围有几个格子不为空,然后选出最大的值
一个很神奇的点是,如果当前有多个备选项值相等,那么总是选最后一个
想了想,可能是这样的点往往位于偏右下角的位置,不容易造成全局上的影响
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
int n,m,k;
bool check(int x,int y){
return (x>=0&&x<n&&y>=0&&y<m);
}
// void calc(const vector<vector<int>> &matrix,vector<vector<int>> &map,int x,int y)
// {
// for(int i=-1;i<=1;++i)
// {
// for(int j=-1;j<=1;++j){
// int dx = x+i,dy=y+j;
// if(check(dx,dy))
// map[x][y] += matrix[dx][dy]>0?1:0;
// }
// }
// }
int calc2(const vector<vector<int>> &matrix,int x,int y)
{
int ans=0;
for(int i=-1;i<=1;++i)
{
for(int j=-1;j<=1;++j){
int dx = x+i,dy=y+j;
if(check(dx,dy))
ans += matrix[dx][dy]>0?1:0;
}
}
return ans;
}
void sweep(vector<vector<int>> &matrix,int x,int y)
{
for(int i=-1;i<=1;++i)
{
for(int j=-1;j<=1;++j){
int dx = x+i,dy=y+j;
if(check(dx,dy)&&matrix[dx][dy]>0)
matrix[dx][dy] -= 1;
}
}
}
int main(){
while(scanf("%d %d %d",&n,&m,&k)!=EOF){
vector<vector<int>> matrix(n,vector<int>(m,0));
int x,y;
int ans=0;
for(int i=0;i<k;++i)
{
scanf("%d %d",&x,&y);
matrix[x-1][y-1]++;
}
int two = 2;
int nowMax;
pair<int,int> coord;
while(two--)
{
nowMax = 0;
//vector<vector<int>> map(n,vector<int>(m,0));
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
//cout<<matrix[i][j]<<" ";
//calc(matrix,map,i,j);
int now = calc2(matrix,i,j);
if(now>=nowMax){
nowMax= now;
coord = make_pair(i,j);
}
}
//cout<<endl;
}
sweep(matrix,coord.first,coord.second);
ans+=nowMax;
//cout<<endl;
}
cout<<ans<<endl;
}
}
京公网安备 11010502036488号