题目描述:
话说有一天 linyorson 在“我的世界”开了一个 n×n(n≤100)n\times n(n\le 100)n×n(n≤100) 的方阵,现在他有 mmm 个火把和 kkk 个萤石,分别放在 (x1,y1)...(xm,ym)(x_1,y_1)...(x_m,y_m)(x1,y1)...(xm,ym) 和 (o1,p1)...(ok,pk)(o_1,p_1)...(o_k,p_k)(o1,p1)...(ok,pk) 的位置,没有光或没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?
P.S.火把的照亮范围是:
|暗|暗| 光 |暗|暗| |暗|光| 光 |光|暗| |光|光|火把|光|光| |暗|光| 光 |光|暗| |暗|暗| 光 |暗|暗|
萤石:
|光|光| 光 |光|光| |光|光| 光 |光|光| |光|光|萤石|光|光| |光|光| 光 |光|光| |光|光| 光 |光|光|
输入:
输入共m+k+1行。
第一行为n,m,k。
第2到第m+1行分别是火把的位置xi yi。
第m+2到第m+k+1行分别是萤石的位置oi pi。
注:可能没有萤石,但一定有火把。
所有数据保证在int范围内。
输出:
有几个点会生出怪物。
样例输入:
5 1 0
3 3
样例输出:
12
解题思路:
这道题就是根据那两张图上,火把和萤石分别可以照亮的范围用坐标给表示出来,这里用一个二维数组去标记,如果被照亮就标记为1,所以暴力结束后,二维数组中剩下为0的那些值就是会出现怪物的地方。
程序代码:
#include<bits/stdc++.h> using namespace std; int main() { int n,m,k,i,j,o,p,q,r,sum=0; int dis[101][101]; cin>>n>>m>>k; memset(dis,0,sizeof(dis)); for(i=1;i<=m;i++) { cin>>o>>p; dis[o][p]=1; dis[o+1][p]=1; dis[o+1][p+1]=1; dis[o][p+1]=1; dis[o-1][p+1]=1; dis[o-1][p]=1; dis[o-1][p-1]=1; dis[o][p-1]=1; dis[o+1][p-1]=1; dis[o+2][p]=1; dis[o][p+2]=1; dis[o-2][p]=1; dis[o][p-2]=1; } for(i=1;i<=k;i++) { cin>>q>>r; dis[q][r]=1; dis[q+1][r]=1; dis[q+1][r+1]=1; dis[q][r+1]=1; dis[q-1][r+1]=1; dis[q-1][r]=1; dis[q-1][r-1]=1; dis[q][r-1]=1; dis[q+1][r-1]=1; dis[q+2][r]=1; dis[q+2][r+1]=1; dis[q+2][r+2]=1; dis[q+1][r+2]=1; dis[q][r+2]=1; dis[q-1][r+2]=1; dis[q-2][r+2]=1; dis[q-2][r+1]=1; dis[q-2][r]=1; dis[q-2][r-1]=1; dis[q-2][r-2]=1; dis[q-1][r-2]=1; dis[q][r-2]=1; dis[q+1][r-2]=1; dis[q+2][r-2]=1; dis[q+2][r-1]=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(!dis[i][j]) sum++; cout<<sum<<endl; return 0; }#include<bits/stdc++.h> using namespace std; int main() { int n,m,k,i,j,o,p,q,r,sum=0; int dis[101][101]; cin>>n>>m>>k; memset(dis,0,sizeof(dis)); for(i=1;i<=m;i++) { cin>>o>>p; dis[o][p]=1; dis[o+1][p]=1; dis[o+1][p+1]=1; dis[o][p+1]=1; dis[o-1][p+1]=1; dis[o-1][p]=1; dis[o-1][p-1]=1; dis[o][p-1]=1; dis[o+1][p-1]=1; dis[o+2][p]=1; dis[o][p+2]=1; dis[o-2][p]=1; dis[o][p-2]=1; } for(i=1;i<=k;i++) { cin>>q>>r; dis[q][r]=1; dis[q+1][r]=1; dis[q+1][r+1]=1; dis[q][r+1]=1; dis[q-1][r+1]=1; dis[q-1][r]=1; dis[q-1][r-1]=1; dis[q][r-1]=1; dis[q+1][r-1]=1; dis[q+2][r]=1; dis[q+2][r+1]=1; dis[q+2][r+2]=1; dis[q+1][r+2]=1; dis[q][r+2]=1; dis[q-1][r+2]=1; dis[q-2][r+2]=1; dis[q-2][r+1]=1; dis[q-2][r]=1; dis[q-2][r-1]=1; dis[q-2][r-2]=1; dis[q-1][r-2]=1; dis[q][r-2]=1; dis[q+1][r-2]=1; dis[q+2][r-2]=1; dis[q+2][r-1]=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(!dis[i][j]) sum++; cout<<sum<<endl; return 0; }