CodeForces - 203B

该问题描述了一个游戏场景,Valera在n×n的棋盘上依次涂黑m个格子,询问最少需要多少步可以形成一个边长为3的黑色正方形。输入包括棋盘大小n和涂黑格子数m,以及每步涂黑的坐标。输出是最小的形成3x3黑色方块的步数,若无法形成则输出-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

One not particularly beautiful evening Valera got very bored. To amuse himself a little bit, he found the following game.

He took a checkered white square piece of paper, consisting of n × n cells. After that, he started to paint the white cells black one after the other. In total he painted m different cells on the piece of paper. Since Valera was keen on everything square, he wondered, how many moves (i.e. times the boy paints a square black) he should make till a black square with side 3 can be found on the piece of paper. But Valera does not know the answer to this question, so he asks you to help him.

Your task is to find the minimum number of moves, till the checkered piece of paper has at least one black square with side of 3. Otherwise determine that such move does not exist.

Input

The first line contains two integers n and m (1 ≤ n ≤ 1000, 1 ≤ m ≤ min(n·n, 105))— the size of the squared piece of paper and the number of moves, correspondingly.

Then, m lines contain the description of the moves. The i-th line contains two integers xiyi (1 ≤ xi, yi ≤ n) — the number of row and column of the square that gets painted on the i-th move.

All numbers on the lines are separated by single spaces. It is guaranteed that all moves are different. The moves are numbered starting from 1 in the order, in which they are given in the input. The columns of the squared piece of paper are numbered starting from 1, from the left to the right. The rows of the squared piece of paper are numbered starting from 1, from top to bottom.

Output

On a single line print the answer to the problem — the minimum number of the move after which the piece of paper has a black square with side 3. If no such move exists, print -1.

Examples

Input

4 11
1 1
1 2
1 3
2 2
2 3
1 4
2 4
3 4
3 2
3 3
4 1

Output

10

Input

4 12
1 1
1 2
1 3
2 2
2 3
1 4
2 4
3 4
3 2
4 2
4 1
3 1

Output

-1

题意:

给一个n和m,代表有n*n的方格,m行输入给的格子,问到第几行时会出现3*3的方格都被走过;

先把每一步的路都存起来,再暴力找哪个是3*3的,并找出这个3*3中最大的是第几步;

#include <iostream>
#include <string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int maze[1005][1005];
int ji[1005][1005];
bool re(int i,int j)//判断
{
    if(maze[i][j]==1)
        if(maze[i-1][j]==1)
            if(maze[i+1][j]==1)
                if(maze[i][j-1]==1)
                    if(maze[i][j+1]==1)
                        if(maze[i-1][j-1]==1)
                            if(maze[i-1][j+1]==1)
                                if(maze[i+1][j-1]==1)
                                    if(maze[i+1][j+1]==1)
                                        return true;
    return false;
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        memset(maze,0,sizeof(maze));
        memset(ji,0,sizeof(ji));
        int flag=0;
        for(int i=0; i<m; i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            ji[a][b]=i+1;
            maze[a][b]=1;
        }
        int ans=1000005,nnn;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(re(i,j))
                {
                    flag=1;
                    nnn=ji[i][j];
//                    if(ji[i][j]>nnn)nnn=ji[i][j];
                    if(ji[i-1][j]>nnn)nnn=ji[i-1][j];
                    if(ji[i+1][j]>nnn)nnn=ji[i+1][j];
                    if(ji[i][j-1]>nnn)nnn=ji[i][j-1];
                    if(ji[i][j+1]>nnn)nnn=ji[i][j+1];
                    if(ji[i-1][j-1]>nnn)nnn=ji[i-1][j-1];
                    if(ji[i-1][j+1]>nnn)nnn=ji[i-1][j+1];
                    if(ji[i+1][j-1]>nnn)nnn=ji[i+1][j-1];
                    if(ji[i+1][j+1]>nnn)nnn=ji[i+1][j+1];
                    if(nnn<ans)
                        ans=nnn;
                }
            }
        }
        if(flag)
            printf("%d\n",ans);
        else
            printf("-1\n");
    }
    return 0;

}


 

### Codeforces Problem 976C Solution in Python For solving problem 976C on Codeforces using Python, efficiency becomes a critical factor due to strict time limits aimed at distinguishing between efficient and less efficient solutions[^1]. Given these constraints, it is advisable to focus on optimizing algorithms and choosing appropriate data structures. The provided code snippet offers insight into handling string manipulation problems efficiently by customizing comparison logic for sorting elements based on specific criteria[^2]. However, for addressing problem 976C specifically, which involves determining the winner ('A' or 'B') based on frequency counts within given inputs, one can adapt similar principles of optimization but tailored towards counting occurrences directly as shown below: ```python from collections import Counter def determine_winner(): for _ in range(int(input())): count_map = Counter(input().strip()) result = "A" if count_map['A'] > count_map['B'] else "B" print(result) determine_winner() ``` This approach leverages `Counter` from Python’s built-in `collections` module to quickly tally up instances of 'A' versus 'B'. By iterating over multiple test cases through a loop defined by user input, this method ensures that comparisons are made accurately while maintaining performance standards required under tight computational resources[^3]. To further enhance execution speed when working with Python, consider submitting codes via platforms like PyPy instead of traditional interpreters whenever possible since they offer better runtime efficiencies especially important during competitive programming contests where milliseconds matter significantly.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值