21 мая 2015 г.

"Ханойские" башни.

/*
Легенда гласит, что где-то в Ханое находится храм, в котором размещена следующая конструкция:
на основании укреплены 3 алмазных стержня, на один из которых при сотворении мира Брахма
нанизал 64 золотых диска с отверстием посередине, причем внизу оказался самый большой диск,
на нем – чуть меньший и так далее, пока на верхушке пирамиды не оказался самый маленький диск.
Жрецы храма обязаны перекладывать диски по следующим правилам:

1. За один ход можно перенести только один диск.

2. Нельзя класть больший диск на меньший.

Руководствуясь этими нехитрыми правилами, жрецы должны перенести исходную пирамиду с 1-го стержня на 3-й.
Как только они справятся с этим заданием, наступит конец света.

Мы предлагаем Вам решить данную задачу с помощью рекурсии.
*/

//Решение взято с vk.com.

void hanoi_towers(int quantity, int from, int to, int buf_peg)
//quantity-число колец, from-начальное положение колец(1-3),to-конечное положение колец(1-3)
{
//buf_peg - промежуточный колышек(1-3)
if (quantity != 0)
{
hanoi_towers(quantity-1, from, buf_peg, to);

cout << from << " -> " << to << "\n";
hanoi_towers(quantity-1, buf_peg, to, from);
}
}

void main()
{
setlocale(LC_ALL, "Russian");
int start_peg, destination_peg, buffer_peg, plate_quantity;
cout << "\nНомер первого столбика:";
cin >> start_peg;
cout << "\nНомер конечного столбика:";
cin >> destination_peg;
cout << "\nНомер промежуточного столбика:";
cin >> buffer_peg;
cout << "\nКоличество дисков:";
cin >> plate_quantity;
cout<<"\n";

hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg);
}

Написать функцию, которая находит максимальное значение в массиве, используя рекурсию

int max(int A[], int size)
{
if(size==1) return A[0];
else
{
int tmp=max(A,size-1);
return tmp>A[size-2]?tmp:A[size-2];
}
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 20+1;
}

void out(int A[], int size)
{
cout << "\n";
for (int i = 0; i < size; i++)
cout << A[i] << " ";
cout << "\n";
}

void main()
{
setlocale(LC_ALL, "Russian");
int digit;
const int size=15;
int A[size];

do
{
cout<<"Эта программа находит максимальное значение в массиве, используя рекурсию\n";
init(A,size);
out(A,size);
cout<<"\nМаксимальное значение - "<<max(A,size)<<"\n";
cout<<"Если хотите продолжить, нажмите 1:";
cin>>digit;
}while(digit==1);
}

Пример на рекурсию

long int Fact(long int N)
{
// если произведена попытка вычислить факториал нуля
// или единицы - вернуть 1,
// именно здесь произведется выход из рекурсии
if (N == 1 || N == 0) return 1;
// любое другое число вызывает функцию заново с формулой N-1
else return N * Fact(N-1);
}

void main()
{
long number=5;
//первый вызов рекурсивной функции
long result=Fact(number);
cout<<"Result "<<number<<"! is - "<<result<<"\n";
}

Двоичный поиск

int BinarySearch (int A[], int Lb, int Ub, int Key)
{
int M;
while(1)
{
M = (Lb + Ub)/2;
if (Key < A[M])
Ub = M - 1;
else
if (Key > A[M])
Lb = M + 1;
else
return M;

if (Lb > Ub)
return -1;
}
}

void main()
{
srand(time(NULL));
const long SIZE=10;
int ar[SIZE];
int key,ind;

// до сортировки
for(int i=0;i<SIZE;i++)
{
ar[i]=rand()%100;
cout<<ar[i]<<"\t";
}
cout<<"\n\n";
cout<<"Enter any digit:";
cin>>key;
ind=BinarySearch(ar,0,SIZE,key);
cout<<"Index - "<<ind<<"\t";
cout<<"\n\n";
}

Написать функцию, которая упорядочит в массиве сначала чётные значения, а потом нечётные

void init(int A[], int size);
void out(int A[], int size);
void sort(int A[], int size);

void main()
{
setlocale(LC_ALL, "Russian");
const int s = 20;
int A[s];
int a;
do
{
cout << "Эта программа сортирует массив по возрастанию сначала чётные значения, а потом нечётные.\n";
init(A, s);
out(A, s);
sort(A, s);
cout << "\nРезультат:\n";
out(A, s);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[], int size)
{
srand(time(NULL));
for (int i = 0; i < size; i++)
A[i] = rand() % 100;
}

void out(int A[], int size)
{
cout << "\n";
for (int i = 0; i < size; i++)
cout << A[i] << " ";
cout << "\n";
}

void sort(int A[], int size)
{
int x, i, j;
for (i = 0; i < size; i++)
{
for (j = size - 1; j > i; j--)
{
if (A[j-1]%2 != 0 && A[j]%2==0)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
if (A[j - 1] > A[j] && A[j] % 2 == 0 && A[j - 1] % 2 == 0)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
if (A[j - 1] > A[j] && A[j] % 2 && A[j - 1] % 2)
{
x = A[j - 1];
A[j - 1] = A[j];
A[j] = x;
}
}
}
}

"Угадай число". Компьютер загадывает число от 0 до 10000. А пользователь должен его угадать, получая подсказки "больше" или "меньше"

void main()
{
srand(time(NULL));
setlocale(LC_ALL, "Russian");
int tmp;
do
{
int digit = rand() % 10000;
cout << "Игра ""Угадай число"". Компьютер загадал число от 0 до 10000 - отгадайте его!)\n";
int a=0;
for (;;)
{
cin >> tmp;
if (digit > tmp)
cout << "Моё число больше!)\n";
else if (digit < tmp)
cout << "Моё число меньше!)\n";
else if (digit == tmp)
{
cout << "Вы угадали!) Моё число - " << digit << "\n";
cout << "Вы использовали " << a << " попыток\n" ;
break;
}
a++;
}
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> tmp;
} while (tmp == 1);
}

Написать функцию, которая сортирует двумерный массив

void init(int A[][10], int weight, int length);
void out(int A[][10], int weight, int length);
void sort(int A[][10], int weight, int length);

void main()
{
setlocale(LC_ALL, "Russian");
const int length = 10;
const int weight = 15;
int A[weight][length];
int a;
do
{
cout << "Эта программа сортирует двумерный массив.\n";
init(A, weight, length);
out(A, weight, length);
sort(A, weight, length);
cout << "\nРезультат:\n";
out(A, weight, length);
cout << "\nЕсли хотите продолжить, нажмите 1\n";
cin >> a;
} while (a == 1);
}

void init(int A[][10], int weight, int length)
{
srand(time(NULL));
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
A[i][j] = rand() % 100;
}
}
}

void out(int A[][10], int weight, int length)
{
cout << "\n";
for (int i = 0; i < weight; i++)
{
for (int j = 0; j < length; j++)
{
cout << A[i][j] << "\t";
}
cout << "\n";
}
cout << "\n";
}

void sort(int A[][10], int weight, int length)
{
int x, i, j, k;
for (k = 0; k < weight*length; k++)
{
for (i = 0; i < weight; i++)
{
for (j = 0; j < length; j++)
{
if (A[i][j-1] > A[i][j])
{
x = A[i][j-1];
A[i][j-1] = A[i][j];
A[i][j] = x;
}
}
}
}
}