C/C++
Нужно сделать программу, с помощью backtracking
Один человек забыл номер телефона друга. Он знает только, что число состоит из 6 цифр, начинается с 4 и содержит 3 нуля, два из которых стоят рядом. запишите все необходимые параметры, чтобы попытаться поговорить с другом.
Так вот кто названивает и трубку бросает.
#include< iostream >
using namespace std;
int main()
{
setlocale(0,"");
bool check = false; //флаг нахождения номера
short num1 = 3, num2 = 5; //итераторы знакомест номера
short number[6]{ 4,5,0,3,0,0 }; //нужный номер телефона
short ournum[6]{ 4,0,0,0,0,0 }; //начальный номер
int iter = 1; // для счетчика (не обязателен)
while (!check) //пока номер не совпадает
{
for (short x = 1; x < 10; x++)
{
for (short y = 1; y < 10; y++)
{
check = true;
ournum[num1] = x;
ournum[num2] = y;
for (short i = 1; i < 6; i++) //а вообще не обязательно проверять все цифры, можно только две num1 и num2.
check &= (number[i] == ournum[i]); // совпадает ли номер? если да то чек останется 1, иначе превратится в 0
if (check) break;
iter++;
}
if (check) break;
}
if (check) break; // выйти из while, если номер совпал
ournum[num1] = 0; // если совпадений не было, вернуть исходные числа.
ournum[num2] = 0;
do // и сместить итераторы
{
num2--;
if (num1 == num2) { num1--; num2 = 5; }
}
while ((num1 == 2 && num2 == 4) || (num2 - num1 == 4)); //учесть условие нулей
}
cout << "\nваш номер: ";
for (short num1 : ournum) cout << num1; // печать номера
cout << " найден за " << iter << " проходов";
}
PS: Вот только в чем может быть непонятка - если три нуля стоят рядом, считается ли это, что два нуля стоят рядом, а третий возле них или нет? ) У меня считается. Если же три нуля можно, то условие num1-num2==4 нужно убрать.
#include< iostream >
using namespace std;
int main()
{
setlocale(0,"");
bool check = false; //флаг нахождения номера
short num1 = 3, num2 = 5; //итераторы знакомест номера
short number[6]{ 4,5,0,3,0,0 }; //нужный номер телефона
short ournum[6]{ 4,0,0,0,0,0 }; //начальный номер
int iter = 1; // для счетчика (не обязателен)
while (!check) //пока номер не совпадает
{
for (short x = 1; x < 10; x++)
{
for (short y = 1; y < 10; y++)
{
check = true;
ournum[num1] = x;
ournum[num2] = y;
for (short i = 1; i < 6; i++) //а вообще не обязательно проверять все цифры, можно только две num1 и num2.
check &= (number[i] == ournum[i]); // совпадает ли номер? если да то чек останется 1, иначе превратится в 0
if (check) break;
iter++;
}
if (check) break;
}
if (check) break; // выйти из while, если номер совпал
ournum[num1] = 0; // если совпадений не было, вернуть исходные числа.
ournum[num2] = 0;
do // и сместить итераторы
{
num2--;
if (num1 == num2) { num1--; num2 = 5; }
}
while ((num1 == 2 && num2 == 4) || (num2 - num1 == 4)); //учесть условие нулей
}
cout << "\nваш номер: ";
for (short num1 : ournum) cout << num1; // печать номера
cout << " найден за " << iter << " проходов";
}
PS: Вот только в чем может быть непонятка - если три нуля стоят рядом, считается ли это, что два нуля стоят рядом, а третий возле них или нет? ) У меня считается. Если же три нуля можно, то условие num1-num2==4 нужно убрать.
Похожие вопросы
- Помогите пожалуйста, нужно сделать программу на C++
- Нужно написать программу с вложенным циклом
- Нужно написать программу на языке C++
- Нужно составить программу для решения дифф. уравнений методом Рунге-Кутта
- Нужно написать программу вхождения точки в круг, при этом рассмотреть отдельно на границе и за пределами
- Массивы c++, нужно написать программу
- Помогите, пожалуйста. Нужно составить программу на Си
- Помогите, пожалуйста, нужно написать программу на C++
- C++ , нужно написать программу с тестом.
- Как сделать куб с помощью SFML?