题意:给定n*m的空白方格,进行k次涂色,将(x,y)处的方格涂成黑色,判断第几次涂色能形成2*2的黑色方格,若不能涂成2*2的方格,输出0。
涂(x,y)时总共就四种情况,四个 if 就能解决,代码太丑。。。。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 1005
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef long long ll;
using namespace std;
int mp[maxn][maxn];
int n,m,k;
bool isok(int x,int y)
{
if (x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y])
return true;
return false;
}
int main()
{
while (~scanf("%d%d%d",&n,&m,&k))
{
int x,y;
int ans=0;
int x1,y1,x2,y2,x3,y3;
memset(mp,0,sizeof(mp));
for (int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
if (mp[x][y])
continue;
x1=x-1,y1=y-1;
x2=x-1,y2=y;
x3=x,y3=y-1;
if (isok(x1,y1)&&isok(x2,y2)&&isok(x3,y3))
{
ans=i;
break;
}
x1=x-1,y1=y;
x2=x-1,y2=y+1;
x3=x,y3=y+1;
if (isok(x1,y1)&&isok(x2,y2)&&isok(x3,y3))
{
ans=i;
break;
}
x1=x,y1=y-1;
x2=x+1,y2=y-1;
x3=x+1,y3=y;
if (isok(x1,y1)&&isok(x2,y2)&&isok(x3,y3))
{
ans=i;
break;
}
x1=x,y1=y+1;
x2=x+1,y2=y;
x3=x+1,y3=y+1;
if (isok(x1,y1)&&isok(x2,y2)&&isok(x3,y3))
{
ans=i;
break;
}
mp[x][y]=1;
}
if (ans<k&&ans)
{
k=k-ans;
while (k--)
scanf("%d%d",&x,&y);
}
printf("%d\n",ans);
}
return 0;
}
/*
2 3 6
2 3
2 2
1 3
2 2
1 2
1 1
2 2 4
1 1
1 2
2 1
2 2
5 3 7
2 3
1 2
1 1
4 1
3 1
5 3
3 2
*/