#include<iostream>
#include<map>
#include<set>
using namespace std;
set<pair<int,int>> lht;
int B[50+5][50+5];
typedef set<pair<int,int>>::iterator Iterator;
int main(){
int n;//树的棵树
int L;//绿化图的大小
int S;//藏宝图的大小
//依次表示绿化图中树的坐标
cin>>n>>L>>S;
for(int i=0;i<n;i++) {
int x,y;//树的坐标
cin>>x>>y;
pair<int,int> node = make_pair(x,y);
lht.insert(node);
}
//输入完整的藏宝图
for(int i=S;i>=0;i--){
for(int j=0;j<=S;j++){
cin>>B[i][j];
}
}
//对绿化图中的每棵树进行检测
int count = 0;
for(Iterator it = lht.begin();it!=lht.end();it++){
pair<int,int> node = *it;//绿化图中的某棵树
int x = node.first;
int y = node.second;
// cout<<"绿化图中的树坐标x= "<<x<<" y= "<<y<<endl;
bool flag = true;
//以绿化图某棵树[x,y]作为原点,与藏宝图中的B[0][0]重合,遍历藏宝图
for(int i=0;i<=S;i++){
for(int j=0;j<=S;j++){
int A_x = x+i;
int A_y = y+j;
// cout<<"试探绿化图A_x= "<<A_x<<"A_y= "<<A_y<<endl;
if(A_x>L || A_y>L) flag = false;//藏宝图右上角超出绿化图边界
pair<int,int> Anode = make_pair(A_x,A_y);
if(lht.find(make_pair(A_x,A_y))==lht.end()){
// cout<<"试探绿化图A_x= "<<A_x<<"A_y= "<<A_y<<"此处不是树"<<endl;
if(B[i][j]==1) //藏宝图是树
flag = false;
}else{
if(B[i][j]!=1){
flag = false;
}
}
}
if(flag==false) break;
}
if(flag) count++;
}
cout<<count<<endl;
//输出藏宝图的正序
// for(int i=0;i<=S;i++){
// for(int j=0;j<=S;j++){
// cout<<B[i][j]<<" ";
// }
// cout<<endl;
// }
return 0;
}
CCF CSP 202206-2寻宝大冒险[带注释满分]
最新推荐文章于 2023-03-12 18:48:22 发布