#include <iostream>
#include <tuple>
#include <vector>
#include <random>
#include <cstdint>
#include <cmath>
#include <algorithm>
typedef std::tuple<std::uintmax_t, std::uintmax_t > Point;
typedef std::vector<Point> PType;
typedef std::vector<std::vector<char>> MType;
PType MakeRandomPoint(const std::uintmax_t& W, const std::uintmax_t& H, const std::uint64_t& Lim,const unsigned int& S = 0) {
//std::uint64_t Lim = 5;
std::uint64_t L = W + H;
std::mt19937 mt(S);
std::uniform_int_distribution<std::uintmax_t> XD(0, std::max<std::intmax_t>(0,(static_cast<std::intmax_t>(W)-1)));
std::uniform_int_distribution<std::uintmax_t> YD(0, std::max<std::intmax_t>(0,(static_cast<std::intmax_t>(H)-1)));
PType R;
for (std::uintmax_t i = 0; i < L; i++) {
std::uintmax_t X = XD(mt);
std::uintmax_t Y = YD(mt);
double ML = Lim*Lim+1;
for (auto o : R) {
double H = ((std::get<0>(o) - X) * (std::get<0>(o) - X)) + ((std::get<1>(o) - Y) * (std::get<1>(o) - Y));
//double H = std::hypot<std::intmax_t,std::intmax_t>(static_cast<std::intmax_t>(std::get<0>(o)) - X, static_cast<std::intmax_t>(std::get<1>(o)) - Y);
ML = std::min<double>(H, ML);
}
if ( ((std::intmax_t)ML >= Lim*Lim)) { R.push_back({ X,Y }); }
}
return R;
}
PType SetWall(const std::uintmax_t& W,const std::uintmax_t& H,const PType& P,const std::uintmax_t Lim = 5) {
PType R = P;
bool F = true;
for (std::uintmax_t Y = 0; Y < H; Y++) {
for (std::uintmax_t X = 0; X < W; X++) {
double ML = Lim*Lim+1;
for (auto& o : P) {
double H = ((std::get<0>(o) - X) * (std::get<0>(o) - X)) + ((std::get<1>(o) - Y) * (std::get<1>(o) - Y));
//double H = std::hypot(std::get<0>(o) - X, std::get<1>(o) - Y);
ML = std::min<double>(H, ML);
}
if ((ML <= (Lim*Lim)) && (ML >= 1)) {
if (ML >= (Lim*Lim) * 0.6) {
R.push_back({ X,Y });
F = false;
}
}
}
}
return (!F) ? SetWall(W, H, R, Lim) : R;
}
MType MakeMap(const PType& P, std::uintmax_t W, std::uintmax_t H) {
MType R(H);
std::uintmax_t i = 0;
for (auto& o : R) {
o.resize(W,' ');
}
for (auto& o : P) {
R[std::get<1>(o)][std::get<0>(o)] = '#';
}
return R;
}
bool Show(const PType& P,std::uintmax_t W,std::uintmax_t H) {
MType M = MakeMap(P, W, H);
std::uintmax_t i = 0;
for (auto oo : M) {
std::cout <<i++<<'\t' << '*';
for (auto o : oo) {
std::cout << o;
}
std::cout << '*';
std::cout << std::endl;
}
return true;
}
PType MakeAnother(std::size_t W, std::size_t H, bool F = true) {
MType M = MakeMap({}, W, H);
PType P;
int V = F ? 0 : 1;
for (std::size_t i = 0; i < H; i++) {
for (std::size_t j = ((i+V)%2);j < W; j+=2) {
P.push_back({j,i});
}
}
return P;
}
int main() {
PType P;
std::uintmax_t W = 15;
std::uintmax_t H = 15;
std::uintmax_t Lim = 5;
/** /
P = MakeRandomPoint(W, H, Lim);
Show(P, W, H);
//
std::cout << std::endl;
P=SetWall(W, H, P, Lim);
Show(P, W, H);
//**/
std::random_device rd;
std::uniform_int_distribution<> ui(0, 1);
for (std::size_t i = 0; i < 16; i++) {
P = MakeAnother(W, H, ui(rd) ? true:false);
Show(P, W, H);
std::cout << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0eXBlZGVmIHN0ZDo6dHVwbGU8c3RkOjp1aW50bWF4X3QsIHN0ZDo6dWludG1heF90ID4gUG9pbnQ7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8UG9pbnQ+IFBUeXBlOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGNoYXI+PiBNVHlwZTsKClBUeXBlIE1ha2VSYW5kb21Qb2ludChjb25zdCBzdGQ6OnVpbnRtYXhfdCYgVywgY29uc3Qgc3RkOjp1aW50bWF4X3QmIEgsIGNvbnN0IHN0ZDo6dWludDY0X3QmIExpbSxjb25zdCB1bnNpZ25lZCBpbnQmIFMgPSAwKSB7CgoJLy9zdGQ6OnVpbnQ2NF90IExpbSA9IDU7CglzdGQ6OnVpbnQ2NF90IEwgPSBXICsgSDsKCXN0ZDo6bXQxOTkzNyBtdChTKTsKCXN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPHN0ZDo6dWludG1heF90PiBYRCgwLCBzdGQ6Om1heDxzdGQ6OmludG1heF90PigwLChzdGF0aWNfY2FzdDxzdGQ6OmludG1heF90PihXKS0xKSkpOwoJc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248c3RkOjp1aW50bWF4X3Q+IFlEKDAsIHN0ZDo6bWF4PHN0ZDo6aW50bWF4X3Q+KDAsKHN0YXRpY19jYXN0PHN0ZDo6aW50bWF4X3Q+KEgpLTEpKSk7CgoJUFR5cGUgUjsKCglmb3IgKHN0ZDo6dWludG1heF90IGkgPSAwOyBpIDwgTDsgaSsrKSB7CgkJc3RkOjp1aW50bWF4X3QgWCA9IFhEKG10KTsKCQlzdGQ6OnVpbnRtYXhfdCBZID0gWUQobXQpOwoKCQlkb3VibGUgTUwgPSBMaW0qTGltKzE7CgkJZm9yIChhdXRvIG8gOiBSKSB7CgkJCWRvdWJsZSBIID0gKChzdGQ6OmdldDwwPihvKSAtIFgpICogKHN0ZDo6Z2V0PDA+KG8pIC0gWCkpICsgKChzdGQ6OmdldDwxPihvKSAtIFkpICogKHN0ZDo6Z2V0PDE+KG8pIC0gWSkpOwoJCQkJCgkJCS8vZG91YmxlIEggPSBzdGQ6Omh5cG90PHN0ZDo6aW50bWF4X3Qsc3RkOjppbnRtYXhfdD4oc3RhdGljX2Nhc3Q8c3RkOjppbnRtYXhfdD4oc3RkOjpnZXQ8MD4obykpIC0gWCwgc3RhdGljX2Nhc3Q8c3RkOjppbnRtYXhfdD4oc3RkOjpnZXQ8MT4obykpIC0gWSk7CgkJCU1MID0gc3RkOjptaW48ZG91YmxlPihILCBNTCk7CgkJfQoJCWlmICggKChzdGQ6OmludG1heF90KU1MID49IExpbSpMaW0pKSB7IFIucHVzaF9iYWNrKHsgWCxZIH0pOyB9Cgl9CgoJcmV0dXJuIFI7Cn0KClBUeXBlIFNldFdhbGwoY29uc3Qgc3RkOjp1aW50bWF4X3QmIFcsY29uc3Qgc3RkOjp1aW50bWF4X3QmIEgsY29uc3QgUFR5cGUmIFAsY29uc3Qgc3RkOjp1aW50bWF4X3QgTGltID0gNSkgewoKCVBUeXBlIFIgPSBQOwoJYm9vbCBGID0gdHJ1ZTsKCWZvciAoc3RkOjp1aW50bWF4X3QgWSA9IDA7IFkgPCBIOyBZKyspIHsKCQlmb3IgKHN0ZDo6dWludG1heF90IFggPSAwOyBYIDwgVzsgWCsrKSB7CgkJCWRvdWJsZSBNTCA9IExpbSpMaW0rMTsKCQkJZm9yIChhdXRvJiBvIDogUCkgewoJCQkJZG91YmxlIEggPSAoKHN0ZDo6Z2V0PDA+KG8pIC0gWCkgKiAoc3RkOjpnZXQ8MD4obykgLSBYKSkgKyAoKHN0ZDo6Z2V0PDE+KG8pIC0gWSkgKiAoc3RkOjpnZXQ8MT4obykgLSBZKSk7CgkJCQkvL2RvdWJsZSBIID0gc3RkOjpoeXBvdChzdGQ6OmdldDwwPihvKSAtIFgsIHN0ZDo6Z2V0PDE+KG8pIC0gWSk7CQoJCQkJTUwgPSBzdGQ6Om1pbjxkb3VibGU+KEgsIE1MKTsKCQkJfQoKCQkJaWYgKChNTCA8PSAoTGltKkxpbSkpICYmIChNTCA+PSAxKSkgewoJCQkJaWYgKE1MID49IChMaW0qTGltKSAqIDAuNikgewoJCQkJCVIucHVzaF9iYWNrKHsgWCxZIH0pOwoJCQkJCUYgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAoIUYpID8gU2V0V2FsbChXLCBILCBSLCBMaW0pIDogUjsKfQoKTVR5cGUgTWFrZU1hcChjb25zdCBQVHlwZSYgUCwgc3RkOjp1aW50bWF4X3QgVywgc3RkOjp1aW50bWF4X3QgSCkgewoJTVR5cGUgUihIKTsKCXN0ZDo6dWludG1heF90IGkgPSAwOwoJZm9yIChhdXRvJiBvIDogUikgewoJCW8ucmVzaXplKFcsJyAnKTsKCX0KCglmb3IgKGF1dG8mIG8gOiBQKSB7CgkJUltzdGQ6OmdldDwxPihvKV1bc3RkOjpnZXQ8MD4obyldID0gJyMnOwoJfQoKCXJldHVybiBSOwp9Cgpib29sIFNob3coY29uc3QgUFR5cGUmIFAsc3RkOjp1aW50bWF4X3QgVyxzdGQ6OnVpbnRtYXhfdCBIKSB7CglNVHlwZSBNID0gTWFrZU1hcChQLCBXLCBIKTsKCXN0ZDo6dWludG1heF90IGkgPSAwOwoJZm9yIChhdXRvIG9vIDogTSkgewoJCXN0ZDo6Y291dCA8PGkrKzw8J1x0JyA8PCAnKic7CgkJZm9yIChhdXRvIG8gOiBvbykgewoJCQlzdGQ6OmNvdXQgPDwgbzsKCQl9CgkJc3RkOjpjb3V0IDw8ICcqJzsKCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJfQoKCXJldHVybiB0cnVlOwp9CgpQVHlwZSAgTWFrZUFub3RoZXIoc3RkOjpzaXplX3QgVywgc3RkOjpzaXplX3QgSCwgYm9vbCBGID0gdHJ1ZSkgewoJTVR5cGUgTSA9IE1ha2VNYXAoe30sIFcsIEgpOwoJUFR5cGUgUDsKCWludCBWID0gRiA/IDAgOiAxOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEg7IGkrKykgewoJCWZvciAoc3RkOjpzaXplX3QgaiA9ICgoaStWKSUyKTtqIDwgVzsgais9MikgewoJCQlQLnB1c2hfYmFjayh7aixpfSk7CgkJfQoJfQoJcmV0dXJuIFA7Cn0KCmludCBtYWluKCkgewoKCQoJUFR5cGUgUDsKCXN0ZDo6dWludG1heF90IFcgPSAxNTsKCXN0ZDo6dWludG1heF90IEggPSAxNTsKCXN0ZDo6dWludG1heF90IExpbSA9IDU7CgkvKiogLwkKCVAgPSBNYWtlUmFuZG9tUG9pbnQoVywgSCwgTGltKTsKCglTaG93KFAsIFcsIEgpOwoKCS8vCglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCVA9U2V0V2FsbChXLCBILCBQLCBMaW0pOwoKCVNob3coUCwgVywgSCk7CgoJLy8qKi8KCglzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjw+IHVpKDAsIDEpOwoKCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJUCA9IE1ha2VBbm90aGVyKFcsIEgsIHVpKHJkKSA/IHRydWU6ZmFsc2UpOwoJCVNob3coUCwgVywgSCk7CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCglyZXR1cm4gMDsKfQ==