题目链接:插火把
很水。
建立一个数组,然后依次读取每个坐标,然后把不会产生怪的点标上记号,回头数一下即可,
上代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int vis[n][n];
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
x--;y--;
vis[x][y]=1;
if(x-2>=0)vis[x-2][y]=1;
if(x-1>=0)vis[x-1][y]=1;
if(x-1>=0&&y-1>=0)vis[x-1][y-1]=1;
if(x-1>=0&&y+1<n)vis[x-1][y+1]=1;
if(y-2>=0)vis[x][y-2]=1;
if(y-1>=0)vis[x][y-1]=1;
if(y+1<n)vis[x][y+1]=1;
if(y+2<n)vis[x][y+2]=1;
if(x+1<n)vis[x+1][y]=1;
if(x+1<n&&y-1>=0)vis[x+1][y-1]=1;
if(x+1<n&&y+1<n)vis[x+1][y+1]=1;
if(x+2<n)vis[x+2][y]=1;
}
for(int i=0;i<k;i++){
int x,y;
scanf("%d%d",&x,&y);
x--;y--;
for(int j=x-2;j<=x+2;j++){
if(j>=0&&j<n){
for(int k=y-2;k<=y+2;k++){
if(k>=0&&k<n){
vis[j][k]=1;
}
}
}
}
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(vis[i][j]==0){
ans++;
}
}
}
printf("%d",ans);
return 0;
}
没啥可讲的,注意一下越界判断就行。