2 条题解

  • 2
    @ 2025-12-11 21:05:49

    用map数组记录哪些点访问过,防止重复计算

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int dx[]={2,1,-1,-2,-2,-1,1,2};
    int dy[]={1,2,2,1,-1,-2,-2,-1};
    map<pair<int,int>,bool>mp;
    int n,m,sum;
    bool check(int x,int y)
    {
    	if(x>0&&x<=n&&y>0&&y<=n)return 1;
    	return 0;
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);cout.tie(0);
    	cin>>n>>m;
    	for(int i=1,x,y;i<=m;i++)
    	{
    		cin>>x>>y;
    		if(mp[{x,y}]==0)sum++;
    		mp[{x,y}]=1;
    		for(int t=0;t<8;t++)
    		{
    			int xx=x+dx[t],yy=y+dy[t];
    			if(check(xx,yy)==0)continue;
    			if(mp[{xx,yy}]==0)sum++;
    			mp[{xx,yy}]=1;
    		}
    	}
    	cout<<n*n-sum;
    	return 0;
    }
    
    • 1
      @ 2026-3-8 14:46:01

      setset 会自动去重

      #include<bits/stdc++.h>
      using namespace std;
      #define chk(x,y) (x>=1&&y>=1&&x<=n&&y<=n)
      int n,m;
      set<pair<int,int>>a;
      int main(){
      	scanf("%d%d",&n,&m);
      	for(int i=1;i<=m;i++){
      		int x,y;
      		scanf("%d%d",&x,&y);
      		if(chk(x,y))
      			a.insert({x,y});
      		if(chk(x+2,y+1))
      			a.insert({x+2,y+1});
      		if(chk(x+1,y+2))
      			a.insert({x+1,y+2});
      		if(chk(x-1,y+2))
      			a.insert({x-1,y+2});
      		if(chk(x-2,y+1))
      			a.insert({x-2,y+1});
      		if(chk(x-2,y-1))
      			a.insert({x-2,y-1});
      		if(chk(x-1,y-2))
      			a.insert({x-1,y-2});
      		if(chk(x+1,y-2))
      			a.insert({x+1,y-2});
      		if(chk(x+2,y-1))
      			a.insert({x+2,y-1});
      	}
      	printf("%lld",1LL*n*n-a.size());
      	return 0;
      }
      
      • 1

      信息

      ID
      7910
      时间
      4000ms
      内存
      1024MiB
      难度
      4
      标签
      递交数
      24
      已通过
      16
      上传者