题解 P6559 【[SBCOI2020]小镇】

· · 题解

其实这道题主要代码2行就好了,连if都不用。

定义一个二维map数组,如果不会map的请看这边:

先写一个map,map是关键字
map<数组下标类型,数组存储类型>数组名;

举一个例子:
map<long long,long long>a;
就是一个数组a,下标类型是long long,存储类型是long long
有的时候数组不够大就可以这样写,就是速度会比普通数组慢一些 

这道题可以开一个map数组,数组下标是char类型的,存储的数据是int型的
就像这样:
map<char,int>a; 

二维数组的话只要在map里面再写一个map就好了,比如这样:
map<int,map<int,int> >;

如果这里有房子就为1,没有则为0。所以,可以直接把上下左右的数加起来,如果有房子为1就加1,没有为0就相当于加0,也就是什么也没有加。代码很简洁,有压一点行。代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,k,x,y,ans;
map<int,map<int,int> >a;
int main()
{
    for(cin>>n>>k;k--&&cin>>x>>y&&(a[x][y]=1);)//把输入循环赋值全部压这行里了 
        ans+=a[x-1][y]+a[x+1][y]+a[x][y+1]+a[x][y-1];//上下左右全部加起来 
    cout<<ans;//输出答案 
    return 0;
}

谢谢观赏