#include <iostream>
#include <map>
#include <string>
#include <vector>
bool increase(const std::vector<std::string>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] == v[index].size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
void do_job(const std::vector<std::string>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = v.size(); i != size; ++i) {
std::cout << v[i][it[i]];
}
std::cout << std::endl;
}
void iterate(const std::vector<std::string>& v)
{
std::vector<std::size_t> it(v.size(), 0);
do {
do_job(v, it);
} while (increase(v, it));
}
int main()
{
const std::map<int, std::string> m = {
{0, "*"}, {1, "#" }, {2, "ABC"},
{3, "DEF"}, {4, "GHI"}, {5, "JKL"},
{6, "MNO"}, {7, "PQR"}, {8, "STU"},
{9, "VWXYZ"}
};
const std::vector<int> numbers = {0, 2, 3};
std::vector<std::string> v;
for (auto n : numbers) {
v.push_back(m.at(n));
}
iterate(v);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKYm9vbCBpbmNyZWFzZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHYsIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgaXQpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDAsIHNpemUgPSBpdC5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgaW5kZXggPSBzaXplIC0gMSAtIGk7CiAgICAgICAgKytpdFtpbmRleF07CiAgICAgICAgaWYgKGl0W2luZGV4XSA9PSB2W2luZGV4XS5zaXplKCkpIHsKICAgICAgICAgICAgaXRbaW5kZXhdID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCnZvaWQgZG9fam9iKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdiwgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+JiBpdCkKewogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMCwgc2l6ZSA9IHYuc2l6ZSgpOyBpICE9IHNpemU7ICsraSkgewogICAgICAgIHN0ZDo6Y291dCA8PCB2W2ldW2l0W2ldXTsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCnZvaWQgaXRlcmF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHYpCnsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpdCh2LnNpemUoKSwgMCk7CgogICAgZG8gewogICAgICAgIGRvX2pvYih2LCBpdCk7CiAgICB9IHdoaWxlIChpbmNyZWFzZSh2LCBpdCkpOwp9CgppbnQgbWFpbigpCnsKICAgIGNvbnN0IHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG0gPSB7CiAgICAgICAgezAsICIqIn0sIHsxLCAiIyIgIH0sIHsyLCAiQUJDIn0sCiAgICAgICAgezMsICJERUYifSwgezQsICJHSEkifSwgezUsICJKS0wifSwKICAgICAgICB7NiwgIk1OTyJ9LCB7NywgIlBRUiJ9LCB7OCwgIlNUVSJ9LAogICAgICAgIHs5LCAiVldYWVoifQogICAgfTsKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gbnVtYmVycyA9IHswLCAyLCAzfTsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2OwogICAgZm9yIChhdXRvIG4gOiBudW1iZXJzKSB7CiAgICAgICAgdi5wdXNoX2JhY2sobS5hdChuKSk7CiAgICB9CiAgICBpdGVyYXRlKHYpOwogICAgcmV0dXJuIDA7Cn0K