插火把(水题测试2017082501&洛谷1789)

来源:互联网 发布:asp通用查询系统源码 编辑:程序博客网 时间:2024/05/04 04:31

题目链接:插火把
很水。
建立一个数组,然后依次读取每个坐标,然后把不会产生怪的点标上记号,回头数一下即可,
上代码:

#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;} 

没啥可讲的,注意一下越界判断就行。