/* * Same as the Illumination but does not use randomization to * break a long dependency chain such as one generated by bad.pl. */ #include #include #include #include using namespace std ; struct ordered { ordered(int k1_, int k2_, int fk_) : k1(k1_), k2(k2_), fk(fk_) {} ordered() : k1(0), k2(0), fk(0) {} bool operator<(const ordered &o) const { if (k1 != o.k1) return k1 < o.k1 ; if (k2 != o.k2) return k2 < o.k2 ; return fk < o.fk ; } int k1, k2, fk ; } ; vector findneighbors(vector &byk, int at, int R) { vector neighbors ; for (int i=at-1; i>=0; i--) { if (byk[at].k1 != byk[i].k1 || byk[at].k2 - byk[i].k2 >= 2 * R + 1) break ; neighbors.push_back(byk[i].fk) ; } for (int i=at+1; i= 2 * R + 1) break ; neighbors.push_back(byk[i].fk) ; } return neighbors ; } int main(int argc, char *[]) { int R, L ; cin >> R ; cin >> R >> L ; vector xa, ya, b ; vector byx, byy ; // b: -1=undefined, 0=horizontal, 1=vertical for (int i=0; i> y >> x ; xa.push_back(x) ; ya.push_back(y) ; byx.push_back(ordered(x, y, i)) ; byy.push_back(ordered(y, x, i)) ; b.push_back(-1) ; } sort(byx.begin(), byx.end()) ; sort(byy.begin(), byy.end()) ; vector tobyx(L), tobyy(L) ; for (int i=0; i q ; b[i] = tv ; q.push_back(i) ; int qg = 0 ; while (!fail && qg < q.size()) { int j = q[qg++] ; vector neighbors ; assert(b[j]>=0) ; assert(byx[tobyx[j]].fk == j) ; assert(byy[tobyy[j]].fk == j) ; if (b[j] == 0) neighbors = findneighbors(byy, tobyy[j], R) ; else neighbors = findneighbors(byx, tobyx[j], R) ; // cout << "Set " << j << " to " << b[j] << ":" ; // for (auto k : neighbors) cout << " " << k ; // cout << endl ; for (auto k : neighbors) { if (b[k] == -1) { b[k] = 1 - b[j] ; q.push_back(k) ; } else if (b[k] == b[j]) { fail = 1 ; } else { // okay, nothing to do here } } } // cout << (fail ? "Fail" : "Succeed") << endl ; if (fail) { for (int k=0; k board ; for (int i=0; i<=hin; i++) { board.push_back(string()) ; for (int j=0; j<=hin; j++) board[i].push_back('.') ; } for (int i=0; i -1) { for (int j=-R; j<=R; j++) if (b[i] == 0) { if (x + j >= 0 && x + j <= hin) board[y][x+j] = '*' ; } else { if (y + j >= 0 && y + j <= hin) board[y+j][x] = '*' ; } } } for (int i=0; i