前提・実現したいこと
以下の問題を解いているのですが、次の座標圧縮の関数を用いても領域が圧縮されません。具体的にどこが誤っているのかご指摘いただけると幸いです。よろしくお願いします。
問題
W * Hの格子状にN本の垂直または水平な幅1の直線が引かれています。格子は線によって何個の領域に分かれているか。
入力サンプル
W = 10, H = 10, N = 5
X1 = {1, 1, 4, 9, 10}
X2 = {6, 10, 4, 9, 10}
Y1 = {4, 8, 1, 1, 6}
Y2 = {4, 8 10, 5, 10}
X1[i], X2[i], Y1[i], Y2[i]はi番目の直線の2つの端点の座標((X1[i], Y1[i]), (X2[i], Y2[i]))
該当のソースコード
c++
1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4typedef long double ld; 5 6const int INF = 1e9; 7 8template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } 9template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } 10template <typename Type> inline string toString(const Type &a){ostringstream oss; oss << a; return oss.str();} 11 12int W, H, N; 13 14 15int compress(vector<int> &x1, vector<int> &x2, int w){ 16 vector<int> xs; 17 for(int i = 0; i < N; ++i){ 18 for(int d= -1; d <= 1; ++d){ 19 int tx1 = x1[i] + d, tx2 = x2[i] + d; 20 if(tx1 >= 1 && tx1 <= w){ 21 xs.push_back(tx1); 22 } 23 if(tx2 >= 1 && tx2 <= w){ 24 xs.push_back(tx2); 25 } 26 } 27 } 28 sort(xs.begin(), xs.end()); 29 auto it = unique(xs.begin(), xs.end()); 30 xs.erase(it, xs.end()); 31 for(int i = 0; i < N; ++i){ 32 x1[i] = lower_bound(xs.begin(), xs.end(), x1[i]) - xs.begin(); 33 x2[i] = lower_bound(xs.begin(), xs.end(), x2[i]) - xs.begin(); 34 } 35 return xs.size(); 36} 37 38vector<vector<int>> tile; 39vector<int> X1, X2, Y1, Y2; 40int dx[4] = {1, 0 , -1, 0}, dy[4] = {0, 1, 0, -1}; 41int main(){ 42 ios::sync_with_stdio(false); 43 cin.tie(0); 44 cin >> W >> H >> N; 45 X1.resize(N); 46 X2.resize(N); 47 Y1.resize(N); 48 Y2.resize(N); 49 for(int i = 0; i < N; ++i) cin >> X1[i]; 50 for(int i = 0; i < N; ++i) cin >> X2[i]; 51 for(int i = 0; i < N; ++i) cin >> Y1[i]; 52 for(int i = 0; i < N; ++i) cin >> Y2[i]; 53 W = compress(X1, X2, W); H = compress(Y1, Y2, H); 54 tile.assign(H, vector<int>(W, 0)); 55 for(int i = 0; i < N; ++i){ 56 for(int y = Y1[i]; y <= Y2[i]; ++y){ 57 for(int x = X1[i]; x <= X2[i]; ++x){ 58 tile[y][x] = 1; 59 } 60 } 61 } 62 63 int ans = 0; 64 for(int y = 0; y < H; ++y){ 65 for(int x = 0; x < W; ++x){ 66 if(tile[y][x]) continue; 67 queue<pair<int, int>> que; 68 que.push(make_pair(x, y)); 69 tile[y][x] = 1; 70 ans++; 71 while(!que.empty()){ 72 pair<int, int> p = que.front(); que.pop(); 73 for(int i = 0; i < 4; ++i){ 74 int nx = p.first + dx[i], ny = p.second = p.second + dy[i]; 75 if(nx >= 0 && nx < W && ny >= 0 && ny < H){ 76 if(tile[ny][nx]) continue; 77 else{ 78 que.push(make_pair(nx,ny)); 79 tile[ny][nx] = 1; 80 } 81 } 82 } 83 } 84 85 } 86 } 87 cout << ans << endl; 88 89}
回答1件
あなたの回答
tips
プレビュー