C/C++

Друзья помогите с ребусом VOLVO+FIAT=MOTOR. I need your help urgently...Мой код ниже. Посоветуйте с циклами!)))

Напишите программу, которая выводит все решения ребуса VOLVO+FIAT=MOTOR в лексикографическом порядке. Одинаковым буквам соответствуют одинаковые цифры. Разным буквам соответствуют разные цифры. Решения надо пронумеровать, отделяя номер от ответа знаком табуляции "\t".

Напишите программу. Тестируется через stdin → stdout
Пока неверно. Не опускайте руки - попробуйте еще раз!
Failed. Wrong answer
Time Limit: 5 секунд
Memory Limit: 256 MB

#include "iostream"

using namespace std;

int main(int argc, char* argv[]) {

int counter = 1;

for (int V = 1; V <= 8; V++){

for (int O = 0; O <= 9; O++){

if (O!=V){

for (int L = 0; L <= 9; L++){

if(L!=V and L!=O){

for (int F=1; F<10; F++){

if(F!=L and F!=V and F!=O){

for (int I=0; I<=9; I++ ){

if(I!=V and I!=O and I!=L and I!=F){

for(int A=0; A <=9; A++){

if(A!=V and A!=O and A!=L and A!=F and A!=I){

for (int T = 0; T <=9; T++){

if(T!=V and T!=O and T!=L and T!=F and T!=I and T!=A){

for (int M = V+1; M <=9; M++){

if (M!=V and M!=O and M!=L and M!=F and M!=I and M!=A)

for (int R = 0; R<=9; R++){

if (R!=V and R!=O and R!=L and R!=F and R!=I and R!=A and R!=T and R!=M){

if(V*10010 + O*1001 + L*100 + V*10 + O + F*1000 + I*100 + A*10 + T == M*10000 + O*1001 + T*100 + O*10 + R){

counter++;

cout << counter << "(\t"<< V<
#include <iostream>
#include <set>
#include <vector>
#include <map>
using namespace std;
static const auto four = 4;
static const auto seven = 7;
static const auto nine = 9;
static const auto ten = 10;
static const auto hundred = 100;
static const auto thousand = 1000;
static const auto min_fiat = 9321;
static const auto max_fiat = 9825;
static const auto ten_thousand = 10000;
static const auto min_volvo = 15615;
static const auto max_volvo = 72672;
static const auto max_sum = 98786;
bool is_volvo(int x) {
const auto v = x / ten_thousand;
const auto o = x % ten;
const auto l = x / hundred % ten;
return v == x / ten % ten && o == x / thousand % ten && v != o && v != l && o != l;
}
bool is_fiat(int x) {
set<int> box;
do box.insert(x % ten); while (x /= ten);
return box.size() == four;
}
bool is_motor(int x) {
auto flag = x / thousand % ten == x / ten % ten;
set<int> box;
do box.insert(x % ten); while (x /= ten);
return flag && box.size() == four;
}
bool is_sum(int v, int f) {
if (v + f > max_sum) return false;
set<int> box;
do box.insert(v % ten); while (v /= ten);
do box.insert(f % ten); while (f /= ten);
return box.size() == seven;
}
bool good(int v, int f, int m) {
if (v % ten != m / ten % ten) return false;
if (f % ten != m / hundred % ten) return false;
set<int> box;
do box.insert(v % ten); while (v /= ten);
do box.insert(f % ten); while (f /= ten);
do box.insert(m % ten); while (m /= ten);
return box.size() == nine;
}
vector<int> get_volvos() {
vector<int> box;
for (auto i = min_volvo; i <= max_volvo; ++i) if (is_volvo(i)) box.push_back(i);
return box;
}
vector<int> get_fiats() {
vector<int> box;
for (auto i = min_fiat; i <= max_fiat; ++i) if (is_fiat(i)) box.push_back(i);
return box;
}
multimap<int, pair<int, int>> results(const vector<int>& volvos, const vector<int>& fiats) {
multimap<int, pair<int, int>> box;
for (const auto& volvo : volvos) {
for (const auto& fiat : fiats) {
if (is_sum(volvo, fiat)) {
const auto motor = volvo + fiat;
if (is_motor(motor) && good(volvo, fiat, motor)) {
box.insert({ motor, { volvo, fiat } });
}
}
}
}
return box;
}
int main() {
auto count = 0;
auto volvos = get_volvos();
auto fiats = get_fiats();
auto result = results(volvos, fiats);
for (const auto& item : result) {
cout
<< ++count << '\t'
<< item.second.first << " + "
<< item.second.second << " = "
<< item.first << '\n';
}
system("pause > nul");
}
Alex Tas
Alex Tas
93 906
Лучший ответ
Александр Денисенко это слишком круто))) еще курса 3 до такого учиться, но прошел код, оперативно, большое спс))
Александр Денисенко выше среднего для компилятора на сервер
Alex Tas for (auto j = 0U; j < nn; ++j) cout << matrix[i][j];
Директиву #include <iomanip> следует удалить из кода
Для начала не M*10000 + O*1001 + T*100 + O*10 + R, а M*10000 + O*1010 + T*100 + R

Я бы ещё заметил, что M=V+1, а F=9, так как только в этом случае сохранится О на позиции 4 - это из-за того, что при сложении в старший разряд на месте F переносится 1. Кроме того R=(O+F)%10. Это сократит число вложенных циклов.
Александр Денисенко да вы правы, спасибо за корректировку))