2 条题解
-
2
用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
会自动去重
#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
- 上传者