暴力模拟,只能70分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; int n ,L,S; vector<vector<int>> table(L+1); vector<vector<int>> tree(n); vector<vector<int>> mine(S+1); int judge(int x,int y) { for(int i = x;i <=S+x;i++) { for(int j = y;j<=S+y;j++) { if(i>L || j>L || table[i][j] != mine [i-x][j-y]) { return 0; } } } return 1; }
int main() { int res = 0; cin >> n>>L>>S; table.resize(L+1); for(int i = 0;i<L+1;i++) { table[i].resize(L+1); for(int j = 0;j<L+1;j++) { table[i][j] = 0; } } tree.resize(n); for(int i = 0;i<n;i++) { tree[i].resize(2); } mine.resize(S+1); for(int i = 0;i<S+1;i++) { mine[i].resize(S+1); } for(int i = 0;i<n;i++) { cin >>tree[i][0] >>tree[i][1]; table[tree[i][0]][tree[i][1]] = 1; } for(int i = S;i >=0;i--) { for(int j = 0;j<S+1;j++) { cin>>mine[i][j]; } } for(int i = 0;i<n;i++) { if(judge(tree[i][0],tree[i][1])) { res++; } } cout << res; return 0; }
|
大地图过大,无法完全绘制出大地图。我们将小地图中的树的坐标,全部转化为一个与小地图(0,0)点的对应关系,我们将小地图与大地图中的点一一对应,若小地图中的树的坐标与大地图中某棵树为(0,0)点时的树的位置完全一样,则为一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; int n ,L,S,num_s = 0; vector<vector<int>> tree; vector<vector<int>> mine1; int judge(int x,int y,int num) { if(x+S > L || y+S > L) return 0; int j = 0; for(int i = 0;i<num_s;i++) { while( num+i+j <n && ((tree[num+i+j][1] > y+S)||(tree[num+i+j][1] < y)) ) { j++; } if(num+i+j >=n) return 0; if(tree[num+i+j][0] != mine1[i][0]+x || tree[num+i+j][1] != mine1[i][1]+y) return 0; } while(num + num_s + j < n && tree[num + num_s+j][0] <= x+S) { if((tree[num + num_s+j][1] <= y+S ) && (tree[num + num_s+j][1] >= y)) return 0; else j++; } return 1; } bool cmp(vector<int>x,vector<int>y) { if(x[0] == y[0]) return x[1] <y[1]; return x[0] < y[0]; } int main() { int res = 0; cin >> n>>L>>S; tree.resize(n); for(int i = 0;i<n;i++) { tree[i].resize(2); } for(int i = 0;i<n;i++) { cin >>tree[i][0] >>tree[i][1]; } for(int i = S;i >=0;i--) { for(int j = 0;j<S+1;j++) { int tmp; cin>>tmp; if(tmp == 1) { num_s ++; vector<int> t(2); t[0] = i; t[1] = j; mine1.push_back(t); } } } sort(mine1.begin(),mine1.end(),cmp); sort(tree.begin(),tree.end(),cmp); for(int i = 0;i<n;i++) { if(judge(tree[i][0],tree[i][1],i)) { res++; } } cout << res; return 0; }
|