题目链接:https://codeforces.com/problemset/problem/203/B
题意:给出n乘n的格子,m步,每步给出x,y,表示在(x,y)这个格子上涂上黑色,求最早形成3乘3黑格的一步,没形成输出-1
思路:每给一个点进行一次判断,一个点九次判断
第一次:假设为3乘3格子中第一行第一列那个点,则从(x,y)点开始判,判到(x+2,y+2)全为黑色则成立
第二次:假设为3乘3格子中第一行第二列那个点,则从(x,y-1)点开始判,判到(x+2,y+1)全为黑色则成立
第三次:假设为3乘3格子中第一行第三列那个点,则从(x,y-2)点开始判,判到(x+2,y)全为黑色则成立
..............
第九次:假设为3乘3格子中第三行第三列那个点,则从(x-2,y-2)点开始判,判到(x,y)全为黑色则成立
其中有一次成立则成立。
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int n,m,x,y;
int A[1010][1010];
int f[15][2]={0,0,0,-1,0,-2,-1,0,-1,-1,-1,-2,-2,0,-2,-1,-2,-2};//设置起点
int pan(int x,int y)
{
for(int k=0;k<9;k++)
{
int p=1;
for(int i=x+f[k][0];p==1&&i<x+f[k][0]+3;i++)
{
for(int j=y+f[k][1];p==1&&j<y+f[k][1]+3;j++)
{
if(A[i][j]==0)
p=0;
}
}
if(p==1)
return 1;
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int ans=-1;
for(int i=1;i<=n;i++)
memset(A[i],0,sizeof(int)*(n+5));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
A[x][y]=1;
if(ans==-1&&pan(x,y))
{
ans=i;
}
}
printf("%d\n",ans);
}
}