时间: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;
}