1月5号 A题 小信下棋

时间:2s 空间:256M

题目描述:

小信有一个n行m列的棋盘,小友在上面放了k颗棋子。小信想知道对于 i 从 0 到 9 ,有多少个3×3的子棋盘包含恰好 i 颗棋子。

输入格式:

第一行包含三个整数 n,m 和 k,表示棋盘大小和棋子数量。

接下来k行包含 k 对整数 xi 和 yi,表示棋子在棋盘上的坐标 。

输出格式:

对于 i 从 0 到 9 ,每行输出一个整数表示答案。

样例1输入:

4 5 8
4 4
1 1
1 4
1 5
3 4
3 2
3 1
2 3

样例1输出:

0
0
0
2
4
0
0
0
0
0

约定与提示

对于100%的数据,3≤n,m≤1e9,0≤k≤min(1e5,n×m),

1≤xi≤n,1≤yi≤m (1≤i≤k),(xi, yi)≠(xj, yj) (i ≠ j)

样例的棋盘如图,黑色为棋子。

题意:

给一个n*M的棋盘,给你k颗棋子的坐标,问包含0颗棋子,1颗,2颗,3颗,4颗,5颗,6颗,7颗,8颗,9颗的九宫格各有几个。

思路:

首先看样例给的数据范围,就不能跟1e9杠上,这用二维数组遍历的肯定存不下的存下了也会超时。

所以我们去看一下有没有数据范围小的,棋子个数k最大1e5可以接受,我们就从棋子入手,我们用棋子影响他周围的九宫格。

只有到第二行第二列开始,四周才有完整的九宫格,而到n行或m列也没有了完整的九宫格,所以我们先判断棋子在的位置是否符合条件(就是不在1行,1列,n行,m列),然后以棋子为中心在周围3*3的全部+1。

这样子我们可以得出1-9的,但是0是没有被影响的,所以我们得特殊对待,我们是知道九宫格个数的(n-2)*(m-2),我们让九宫格个数减去1-9九宫格的个数就是0的九宫格个数。

代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
map<pair<long long,long long >,long long>mp;
long long f[15];
long long xi[9]={0,0,1,1,1,0,-1,-1,-1};
long long yi[9]={0,1,1,0,-1,-1,-1,0,1};
int main(){
    long long n,m,k;
    cin>>n>>m>>k;
    for(long long i=1;i<=k;i++){
        long long x,y;
        cin>>x>>y;
        for(long long k=0;k<9;k++){
            if(x+xi[k]>1&&x+xi[k]<n&&y+yi[k]>1&&y+yi[k]<m)
            mp[{x+xi[k],y+yi[k]}]++;
        }
    } 
    for(auto &i:mp){
        f[i.second]++;
    }
    cout<<(n-2)*(m-2)-mp.size()<<endl;
    for(long long i=1;i<=9;i++){
        cout<<f[i]<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值