题解洛谷P1789(c++解法)【Mc生存】插火把

题目传送门

思路

从每一个火把或萤石为中心枚举每一个有亮光的地方,标记后统计没有标记的地方的个数即可。

代码如下:

#include  
using namespace std;
int n, m, k, a, b, ans;
int s[5005][5005];
//下面:判断是否越界 
bool pd(int x, int y) 
{ 
    if(x < 1 || y < 1 || x > n || y > n) return 0;
    return 1;
}
//进入主函数
int main()
{
    cin>>n>>m>>k; //读入 
     //下面:由于计算火把和萤石的步骤很像,所以合并了 
    for(int i = 1; i <= m + k; i++) 
    {
       	cin>>a>>b; //读入坐标 
        for(int x = -2; x <= 2; x++)
        {
            for(int y = -2; y <= 2; y++)
            { //枚举5*5的方阵(通过计算距离) 
                if((i > m || abs(x) + abs(y) <= 2) && pd(x + a, b + y))
                {
                //如果是萤石(i > m)或者x与y的坐标差的和不超过2(想一想为什么)并且
                //没有越界就标记 
                    s[x + a][b + y]++;
                }
            }
         }      
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
            ans += s[i][j] == 0; 
            /*
            枚举每一个方格,看看是不是==0(即没有亮光)
            */ 
    }
    cout<<ans<<endl; //输出结果 
    return 0;
}

·

你可能感兴趣的:(题解洛谷P1789(c++解法)【Mc生存】插火把)