avatar_Mr.Kernighan

Алгоритмы и построение логики – мои мысли в матрице змейкой

Автор Mr.Kernighan, 2013 Март 22, 19:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlineкреативзацениматрицаалгоритмылогиказмейка

Mr.Kernighan

Вообщем, делать было нечего и я решил потренировать свою логику. Первое что пришло в голову, написать построение матрицы змейкой и вот собственно решил поделиться с Вами. Задачу решал, не прибегая к помощи Google, возможно решения туповатые но уже хорошо что они есть. :)

Т.З.
Спойлер
1) Построить матрицу и заполнить все элементы произвольными числами
2) Перестроить все элементы в форме змейки в порядке возрастания/убывания

[83][86][77][15][93]
[35][86][92][49][21]
[62][27][90][59][63]
[26][40][26][72][36]
[11][68][67][29][82]

[11][15][21][26][26]
[40][36][35][29][27]
[49][59][62][63][67]
[83][82][77][72][68]
[86][86][90][92][93]
[свернуть]
https://liveworkspace.org/code/
Компилятор: C++: 13.0.1 (Intel)
Аргументы: -std=c++11 -Wall -W -pedantic -O2

Вариант решения №1
Спойлер
#include <stdio.h>
#include <stdlib.h>

#include <iostream>

const int MAX_XSIZE = 5;
const int MAX_YSIZE = 5;

void SetMatrix(int **i_Matrix, int i_xSize, int i_ySize)
{
srand(time_t(0));

for (int i = 0; i < i_xSize; i++)
{
for (int j = 0; j < i_ySize; j++)
{
i_Matrix[i][j] = rand() % 100;
}
}
}

void GetMatrix(int **i_Matrix, int i_xSize, int i_ySize)
{
for (int i = 0; i < i_xSize; i++)
{
std::cout << "n";
for (int j = 0; j < i_ySize; j++)
{
std::cout << "[" << i_Matrix[i][j] << "]";
}
}
}

int **BuildMatrix(int *pArray, int i_xSize, int i_ySize)
{
int **Matrix = new int *[i_xSize];
for (int n = 0; n < i_ySize; n++) Matrix[n] = new int [i_ySize];

int ArrayIndex = 0;

for (int i = 0; i < i_xSize; i++)
{
for (int j = 0; j < i_ySize; j++)
{
if (i == 0 || i % 2 == 0)
Matrix[i][j] = pArray[ArrayIndex++];
else Matrix[i][(i_ySize - 1) - j] = pArray[ArrayIndex++];
}
}
return Matrix;
}

void Swap(int *pArray, int i, int j)
{
int Temp = pArray[j];
pArray[j] = pArray[j + 1];
pArray[j + 1] = Temp;
}

int *SortArray(int *pArray, int i_Size)
{
for (int i = 0; i < i_Size; i++)
{
for (int j = 0; j < i_Size; j++)
{
if (pArray[j] > pArray[j + 1])
{
Swap(pArray, i, j);
}
}
}
return pArray;
}

void GetArray(int *pArray, int i_Size)
{
for (int n = 0; n < i_Size; n++) std::cout << "[" << pArray[n] << "]";
}

int *BuildArray(int **i_Matrix, int i_xSize, int i_ySize)
{
int *pArray = new int [i_xSize * i_ySize], ArrayIndex = 0;

for (int i = 0; i < i_xSize; i++)
{
for (int j = 0; j < i_ySize; j++)
{
pArray[ArrayIndex++] = i_Matrix[i][j];
}
}

return pArray;
}

int main()
{
int MAX_ARR_SIZE = MAX_XSIZE * MAX_YSIZE;

int *pArray = new int [MAX_ARR_SIZE];

int **Matrix = new int *[MAX_XSIZE];
for (int n = 0; n < MAX_YSIZE; n++) Matrix[n] = new int [MAX_YSIZE];

SetMatrix(Matrix, MAX_XSIZE, MAX_YSIZE);
GetMatrix(Matrix, MAX_XSIZE, MAX_YSIZE);
std::cout << "n";

pArray = BuildArray(Matrix, MAX_XSIZE, MAX_YSIZE);
std::cout << "n";
GetArray(pArray, MAX_ARR_SIZE);

pArray = SortArray(pArray, MAX_ARR_SIZE - 1);
std::cout << "n";
GetArray(pArray, MAX_ARR_SIZE);

Matrix = BuildMatrix(pArray, MAX_XSIZE, MAX_YSIZE);
std::cout << "n";
GetMatrix(Matrix, MAX_XSIZE, MAX_YSIZE);

for (int n = 0; n < MAX_XSIZE; n++)
delete [] Matrix[n];

delete [] pArray;
delete [] Matrix;

return 0;
}
[свернуть]
Вариант решения №2
Спойлер
#include <stdio.h>
#include <stdlib.h>

#include <iostream>

const int MAX_XSIZE = 5;
const int MAX_YSIZE = 5;

void SetMatrix(int **i_Matrix, int i_xSize, int i_ySize)
{
srand(time_t(0));
for (int i = 0; i < i_xSize; i++)
{
for (int j = 0; j < i_ySize; j++)
{
i_Matrix[i][j] = rand() % 100;
}
}
}

void GetMatrix(int **i_Matrix, int i_xSize, int i_ySize)
{
for (int i = 0; i < i_xSize; i++)
{
std::cout << "n";
for (int j = 0; j < i_ySize; j++)
{
std::cout << "[" << i_Matrix[i][j] << "]";
}
}
}

int GetMin(int **i_pMatrix, int n, int i, int j, int i_ySize)
{
int Min = i_pMatrix[n][i];
if (i_pMatrix[n][j] < Min)
{
Min = i_pMatrix[n][j];
int Temp = i_pMatrix[n][i]; i_pMatrix[n][i] = i_pMatrix[n][j]; i_pMatrix[n][j] = Temp;
}
return Min;
}

int GetMax(int **i_pMatrix, int n, int i, int j, int i_ySize)
{
int Max = i_pMatrix[n][i];
if (i_pMatrix[n][j] > Max)
{
Max = i_pMatrix[n][j];
int Temp = i_pMatrix[n][i]; i_pMatrix[n][i] = i_pMatrix[n][j]; i_pMatrix[n][j] = Temp;
}
return Max;
}

int **BuildMatrix(int **i_pMatrix, int i_xSize, int i_ySize)
{
int **TempMatrix = new int *[i_xSize];
for (int n = 0; n < i_ySize; n++) TempMatrix[n] = new int [i_ySize];

for (int n = 0; n < i_xSize; n++)
{
for (int i = 0; i < i_xSize; i++)
{
for (int j = i; j < i_ySize; j++)
{
if (n == 0 || n % 2 == 0)
TempMatrix[n][i] = GetMin(i_pMatrix, n, i, j, i_ySize);
else TempMatrix[n][i] = GetMax(i_pMatrix, n, i, j, i_ySize);
}
}
}
return TempMatrix;
}

int main()
{
int **i_pMatrix = new int *[MAX_XSIZE];
for (int n = 0; n < MAX_YSIZE; n++) i_pMatrix[n] = new int [MAX_YSIZE];

SetMatrix(i_pMatrix, MAX_XSIZE, MAX_YSIZE);
GetMatrix(i_pMatrix, MAX_XSIZE, MAX_YSIZE);
std::cout << "n";
i_pMatrix = BuildMatrix(i_pMatrix, MAX_XSIZE, MAX_YSIZE);
GetMatrix(i_pMatrix, MAX_XSIZE, MAX_YSIZE);

for (int n = 0; n < MAX_XSIZE; n++)
delete [] i_pMatrix[n];

delete [] i_pMatrix;

return 0;
}
[свернуть]

А как бы решили ее Вы?

зызызы. Если кому интересно, давайте искать интересные задачки и решать их :) Например, мне так показалось достаточно не тривиальной задачей построение матрицы по спирали. Самое главное, не прибегать за помощью к Google, извращаться над задачей исключительно своей головой, я думаю так будет интереснее.

Интересные задачи - Напоминаю, решение без помощи Google
Спойлер
# Задача: Написать программу определения количества шестизначных "счастливых" трамвайных билетов. (000'000 - 999'999)
# Задача: Вывести значения по спирали(по часовой)
# Задача: Вычисление количество слов в предложение
# Задача: Задача: С клавиатуры вводится число, необходимо выдать человеку деньги максимально большими купюрами. Доступные купюры: 1000, 500, 200, 100, 50, 20, 10, 5, 1
# Задача: Подсчитать количество гласных букв в фразе и вывести на экран.
[свернуть]
Найдено и взято на форуме S@nek.

Profesor08

#1
Ну писать код мне лень. И вникать в присутствующий тут тем-более. Но опишу - как бы я сделал.

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


P.S. Новую матрицу делать нет смысла, можно использовать уже имеющуюся.

# Задача: Вычисление количество слов в предложение
Чирканул на JavaScript
var str = "Хочу съесть много вкусных булочек.";
var count = 0;
var word = 0;

for ( i = 0; i < str.length; i++)
{
if (str[i] != ' ' && str[i] != 'знак пунктуации')
{
if (word != 1)
{
count++;
word = 1;
}
}
else
{
word = 0;
}
}

Вот как-то так. С первого раза.

Valorus

Всем доброго времени суток. решил внести свой вклад.

1) Построить матрицу и заполнить все элементы произвольными числами
2) Перестроить все элементы в форме змейки в порядке возрастания/убывания
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string number = "000000";
int counter = 0;
int matr[5][5];
vector<int> values;
int main()
{
for(int i =  0; i < 5; i++)
{
for(int j = 0 ; j < 5; j++)
{
matr[i][j] = ((rand() % 100)+ rand() % 100) % 100;
values.push_back(matr[i][j]);
cout << '[' <<  matr[i][j] << ']' << "t";
}
cout << "n";
}
sort(values.begin() , values.end());
int cur_X = 0 , cur_Y = 0;
bool fw = 1;
cout << "n";
cout << "n";
cout << "n";
for(int i = 0 ; i < 5; i++)
{
if(fw)
{
for(int j = 0 ; j < 5; j++)
{
cout << '[' << values[5*i - 1 + j+1] << ']' << "t";
}
fw = !fw;
}
else
{
for(int j = 4 ; j >= 0; j--)
{
cout << '[' << values[5*i - 1 + j+1] << ']' << "t";
}
fw = !fw;
}
cout << "n";
}
return 0;
}
# Задача: Вычисление количество слов в предложение
#include <iostream>
#include <string>
using namespace std;
int main()
{
string phrase = "You write Nick-name of Target in Private Chat box, and all your commands will take effect on him.";
int count  = 0;
for(int i = 0 ; i < phrase.size(); i++)
if(phrase[i] == ' ' || phrase[i] == '-')
count++;
cout << count + 1;
system("pause >> void");
return 0;
}

# Задача: Подсчитать количество гласных букв в фразе и вывести на экран.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string phrase = "Также можно настроить задание на тестирование знаний согласных глухих и согласных звонких букв. =)";
int counter = 0;
for(int i = 0 ; i < phrase.size(); i++)
{
if(phrase[i] == 'а' || phrase[i] == 'у' || phrase[i] == 'о' || phrase[i] == 'ы' ||
phrase[i] == 'и' || phrase[i] == 'э' || phrase[i] == 'я' || phrase[i] == 'ю' ||
phrase[i] == 'ё' || phrase[i] == 'е' )
counter++;
// а, у, о, ы, и, э, я, ю, ё, е
}
cout << counter;
system("pause >> void");
return 0;
}
# Задача: Задача: С клавиатуры вводится число, необходимо выдать человеку деньги максимально большими купюрами. Доступные купюры: 1000, 500, 200, 100, 50, 20, 10, 5, 1
#include <iostream>
#include <vector>
using namespace std;
vector<int> answer;
int main()
{
int money[10] = {1000,500,200,100,50,20,10,5,2,1};
int amount;
cin >> amount;
int cur = 0;
while (amount != 0)
{
if(amount - money[cur] >= 0)
{
amount -= money[cur];
answer.push_back(money[cur]);
}
else
cur++;
}
for(int i = 0 ; i < answer.size(); i++)
cout << answer[i] << " ";
return 0;
}
# Задача: Написать программу определения количества шестизначных "счастливых" трамвайных билетов. (000'000 - 999'999)
#include <iostream>
using namespace std;
string number = "000000";
int counter = 0;
void rec(int depth)
{
if(depth < 6)
{
for(int j = 0 ; j < 9; j++)
{
number[depth] = j + '0';
rec(depth+1);
}
}
else
{
if(number[0] + number[1] + number[2] == number[3] + number[4] + number[5])
{
//printf("%sn" , &number);
counter++;
}
}
}
int main()
{
rec(0);
cout << counter;
return 0;
}

Похожие темы (1)

Сообщений: 14
Просмотров: 4212