2023/1/5习题日志 T1 小信下棋

文章描述了一个关于棋盘的问题,给定一个n行m列的棋盘和k颗棋子的位置,要求计算出每个3x3子棋盘中恰好含有0到9颗棋子的情况数。作者提出了一种避免使用大数组的解决方案,通过围绕棋子位置更新一个映射并统计不同数量棋子的子棋盘数量。
摘要由CSDN通过智能技术生成

题目描述:

小信有一个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≤10^9,0≤k≤min(105,n×m),

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

一看本题,首先的第一反应是老老实实地开一个地图数组,但是由于10^9就算是bool也开不下。

所以换个思路,从较小的K入手,围绕着K展开。

从黑块入手,在四周的九宫格内加1.

下附AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f;
map<pair<ll, ll>, ll> mp;
ll f[15],n,m,k;
ll tx[9] = {0, 0, 0, 1, 1, 1, -1, -1, -1};
ll ty[9] = {0, 1, -1, 0, 1, -1, 0, 1, -1};
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> k;
    for (ll i = 1; i <= k;i++){
        ll x, y;
        cin >> x >> y;
        for (ll k = 0; k < 9;k++){
            if(x+tx[k]>1&&x+tx[k]<n&&y+ty[k]>1&&y+ty[k]<m)
                mp[{x + tx[k], y + ty[k]}]++;
        }
    }
    for(auto &i:mp){
        f[i.second]++;
    }
    cout << (n - 2) * (m - 2) - mp.size() << "\n";
    for (ll i = 1; i <= 9;i++){
        cout << f[i] << "\n";
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值