Loading...
KonstantinNikolov avatar KonstantinNikolov -1 Точки

Може ли помощ за две задачи на С++

Зад.1 - Спирала

Дадена е квадратна матрица А с n реда (1<=n<=20) от низове, съдържащи думи с максимална дължина 9. Да се напише програма, която намира и извежда на екрана изречението, получено след обхождане на А по спирала в посока по часовниковата стрелка, започвайки от горния ляв ъгъл.

Например: Ако таблицата А има вида показан по долу, изречението
след обхождане по спирала е: abcfjihde. 

a b c

d e f

h i j

 

Зад.2 - Липи

Близо до селището Олимпийски надежди има гора от липи. Липите са разположени по редове и колони, във формата на правоъгълник, и са номерирани по следния начин:

 0    1   2   3   4

 9    8   7   6   5

 10 11 12 13 14

 19 18 17 16 15 

Освен с номера си, всяка липа се описва и с координати на точката, в която се намира(номер на ред и номер на стълб). Например липа с номер 13 има координати (3, 4). 

В последно време са се появили бракониери, които секат всеки ден по едно дърво с координати (x, y). За да спре безразборната сеч, началникът на горското стопанство предложил да се охранява дървото, което ще бъде отсечено (с координати (x, y)). Но охраната знае само номерата на липите, но не и техните координати. 

Вие може да спасите липовата гора от изсичане като напишете програма limes.cpp, която намира номера на липовото дърво от ред x и колона y. От първия ред на стандартния вход се въвеждат четири цели числа n (брой на редовете в липовата гора), m (брой на колоните в липовата гора), x и y (координати на дървото, което ще бъде отсечено), разделени с по един интервал. Програмата трябва да намира и извежда номера на дървото, което трябва да бъде охранявано. (1 ≤ n, m ≤ 100; 1 ≤ x ≤ n; 1 ≤ y ≤ m) 

Пример 

Вход 

5 2 3 1 

Изход 

4

Много ще съм благодарен за решенията, защото аз лично не мога да ги дореша. 

Тагове:
-1
C++ Programming
dimiOrange avatar dimiOrange 63 Точки
Best Answer

Здравей,

Аз съм съставил масивите с Java, но ппредполагам, че също ще е полезно. Моите решения са само за ориентир.

За спиралата изглежда объркано, обаче не е сложно. Проверявах четирите посоки и как се изменя индексацията във всяка от тях. Сигурно има по-елегантни решения, но аз се досетих за това.

Поздрави

 

Липи:

import java.util.Scanner;

public class Linden {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        int n = Integer.parseInt(console.nextLine());
        int m = Integer.parseInt(console.nextLine());
        int x = Integer.parseInt(console.nextLine());
        int y = Integer.parseInt(console.nextLine());

        int[][] forest = new int[n][m];

        int lindenNo = 0;

        for (int i = 0; i < n; i++) {
            if (i % 2 == 0) {
                for (int j = 0; j < m; j++) {
                    forest[i][j] = lindenNo;
                    lindenNo++;
                }
            } else {
                for (int j = m - 1; j >= 0; j--) {
                    forest[i][j] = lindenNo;
                    lindenNo++;
                }
            }
        }

        System.out.println(forest[x - 1][y - 1]);
    }
}

 

 

Спирала:

public class Spiral {
    public static void main(String[] args) {
        int n = 6;
        int[][] spiral = new int[n][n];

        int number = 1;

        int elements = n * n;

        int firstIndexLeftToRight = 0;
        int secondIndexLeftToRight = n;

        int firstIndexTopToBottom = 1;
        int secondIndexTopToBottom = n;
        int thirdIndexTopToBottom = n - 1;

        int firstIndexRightToLeft = n - 2;
        int secondIndexRightToLeft = 0;
        int thirdIndexRightToLeft = n - 1;

        int firstIndexBottomToTop = n - 2;
        int secondIndexBottomToTop = 1;
        int thirdIndexBottomToTop = 0;

        while (elements > 0) {
            for (int j = firstIndexLeftToRight; j < secondIndexLeftToRight; j++) {
                spiral[firstIndexLeftToRight][j] = number;
                number++;
                elements--;
            }
            for (int i = firstIndexTopToBottom; i < secondIndexTopToBottom; i++) {
                spiral[i][thirdIndexTopToBottom] = number;
                number++;
                elements--;
            }
            for (int j = firstIndexRightToLeft; j >= secondIndexRightToLeft; j--) {
                spiral[thirdIndexRightToLeft][j] = number;
                number++;
                elements--;
            }
            for (int i = firstIndexBottomToTop; i >= secondIndexBottomToTop; i--) {
                spiral[i][thirdIndexBottomToTop] = number;
                number++;
                elements--;
            }

            firstIndexLeftToRight++;
            secondIndexLeftToRight--;

            firstIndexTopToBottom++;
            secondIndexTopToBottom--;
            thirdIndexTopToBottom--;

            firstIndexRightToLeft--;
            secondIndexRightToLeft++;
            thirdIndexRightToLeft--;

            firstIndexBottomToTop--;
            secondIndexBottomToTop++;
            thirdIndexBottomToTop++;
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.printf("%4d", spiral[i][j]);
            }
            System.out.println();
        }
    }
}
0
KonstantinNikolov avatar KonstantinNikolov -1 Точки

Благодаря ти !

Преработих ги за С++, изпробвах ги и работят идеално.

0
21/02/2018 11:01:11
TanyaZheleva avatar TanyaZheleva 354 Точки

Дай код, покажи до къде си стигнал и съответно ще получиш насоки.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.