Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 4

Написать программу, выводящую путь коня(клетка за клеткой) с помощью рекурсии

04.01.2014, 22:25. Показов 4392. Ответов 23

Студворк — интернет-сервис помощи студентам
задача классическая: требуется написать программу получающую на вход начальное положение коня на шахматной доске, конь,собственно, должен обойти всю доску(8 на 8), не пропустив ни одной клетки, а выводить она должна путь коня(клетка за клеткой).
программу надо реализовать обязательно с помощью рекурсии.
вот набросок, сильно не ругайтесь за мой подход(возможно неправильный)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace рекурсия
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] X = new int[64], Y = new int[64];
            Console.WriteLine("Введите начальное положение коня");
            X[0] = Convert.ToInt32(Console.ReadLine());
            Y[0] = Convert.ToInt32(Console.ReadLine());
            int i = 0;
            int j = 1;
            Move(X,Y,i,j);
            for (i = 0; i<64; i++)
            {
                Console.WriteLine(X[i] + ' ' + Y[i]);
            }
            Console.ReadLine();
        }
        public static bool k = false;
        public static int f = 0;
        public static int b = 0;
        static void Move(int[] X, int[] Y, int i, int j)
        {
            if (j < 64)
            {
                switch (i)
                {
                    case 0: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] - 2); break;
                    case 1: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] + 1); break;
                    case 2: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] + 2); break;
                    case 3: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] - 1); break;
                    case 4: X[j] = (X[j - 1] - 1); Y[j] = (Y[j - 1] - 2); break;
                    case 5: X[j] = (X[j - 1] + 2); Y[j] = (Y[j - 1] - 1); break;
                    case 6: X[j] = (X[j - 1] + 1); Y[j] = (Y[j - 1] + 2); break;
                    case 7: X[j] = (X[j - 1] - 2); Y[j] = (Y[j - 1] + 1); break;
                }
                for (int l = 0; l < 64 && l != j; j++)
                {
                    if ((X[j] == X[l])&&(Y[j]==Y[l]))
                    {
                        k = true;
                    }
                }
                if (X[j] < 8 && X[j] > -1 && Y[j] < 8 && Y[j] > -1 && !k)
                {
                    i = 0;
                    j++;
                    Move(X, Y, i, j);
                }
                else
                {
                    X[j] = 0; Y[j] = 0;
                    j--;
                    i++;
                    if (i < 8)
                    {
                        Move(X, Y, i, j);
                    }
                    else
                    {
                        f = X[j] - X[j - 1];
                        b = Y[j] - Y[j - 1];
                        if ((f == 1) && (b == 2)) { i = 7; j--; }
                        if ((f == 1) && (b == -2)) { i = 1; j--; }
                        if ((f == -1) && (b == 2)) { i = 3; j--; }
                        if ((f == -1) && (b == -2)) { i = 5; j--; }
                        if ((f == 2) && (b == 1)) { i = 2; j--; }
                        if ((f == 2) && (b == -1)) { i = 6; j--; }
                        if ((f == -2) && (b == 1)) { i = 8; j--; }
                        if ((f == -2) && (b == -1)) { i = 4; j--; }
                    }
                    k = false;
                }
            }
        }
    }
}
ошибку выдает в первом цикле процедуры(вышел за границы массива), не пойму почему.
Подскажите, что еще неправильно пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2014, 22:25
Ответы с готовыми решениями:

Построить алгоритм ходов коня по шахматной доске с помощью рекурсии
Здравствуйте. Суть задачи: построить алгоритм ходов коня по шахматной доске с помощью рекурсии. Классическая задача. Знаю, что есть...

Написать программу поиска числа Фибоначчи с помощью рекурсии
написать программу числа Фибоначчи с помощью рекурсии

Графика: Написать программу, создающую заданную фигуру, с помощью графической рекурсии.
Помогите пожалуйста, необходимо написать программу, создающую данную фигуру, с помощью графической рекурсии.

23
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
05.01.2014, 23:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от dracon4ik Посмотреть сообщение
C#
1
Select(e => Convert.ToInt32(e))
возможно Вам будет интересно, что строчку можно заменить на
C#
1
Select(Convert.ToInt32)
1
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
06.01.2014, 03:44
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
struct Data : IEquatable<Data>
        {
            public int X;
            public int Y;
            public bool Equals(Data other)
            {
                return (this.X == other.X && this.Y == other.Y);
            }
        }
 
        static void Positions(Data position, HashSet<Data> positions, Action<Data> func, int limit)
        {
            Data result;
            if (position.X - 2 > 0)
            {
                if (position.Y + 1 <= limit) if (!positions.Contains(result = new Data { X = position.X - 2, Y = position.Y + 1 })) func(result);
                if (position.Y - 1 > 0) if (!positions.Contains(result = new Data { X = position.X - 2, Y = position.Y - 1 })) func(result);
            }
            if (position.X + 2 <= limit)
            {
                if (position.Y + 1 <= limit) if (!positions.Contains(result = new Data { X = position.X + 2, Y = position.Y + 1 })) func(result);
                if (position.Y - 1 > 0) if (!positions.Contains(result = new Data { X = position.X + 2, Y = position.Y - 1 })) func(result);
            }
            if (position.Y + 2 <= limit)
            {
                if (position.X - 1 > 0) if (!positions.Contains(result = new Data { X = position.X - 1, Y = position.Y + 2 })) func(result);
                if (position.X + 1 <= limit) if (!positions.Contains(result = new Data { X = position.X + 1, Y = position.Y + 2 })) func(result);
            }
            if (position.Y - 2 > 0)
            {
                if (position.X - 1 > 0) if (!positions.Contains(result = new Data { X = position.X - 1, Y = position.Y - 2 })) func(result);
                if (position.X + 1 <= limit) if (!positions.Contains(result = new Data { X = position.X + 1, Y = position.Y - 2 })) func(result);
            }
        }
 
        static HashSet<Data> Kon(Data position, HashSet<Data> positions, int limit)
        {
            if (positions.Count != Math.Pow(limit, 2))
            {
                List<Tuple<Data, int>> result = new List<Tuple<Data, int>>();
                int count = 0;
                Positions(position, positions, _ =>
                {
                    count = 0;
                    Positions(_, positions, __ =>
                    {
                        count++;
                    }, limit);
                    result.Add(new Tuple<Data, int>(_, count));
                }, limit);
                result.Sort((_, __) => (_.Item2 > __.Item2) ? 1 : (_.Item2 == __.Item2) ? 0 : -1);
                foreach (var _ in result)
                {
                    positions.Add(_.Item1);
                    Kon(_.Item1, positions, limit);
                    if (positions.Count == Math.Pow(limit, 2)) return positions;
                }
                positions.Remove(position);
            }
            return positions;
        }
 
        static void Main(string[] args)
        {
            int limit = 8;
            Data init = new Data { X = 1, Y = 1 };
            foreach (var _ in Kon(init, new HashSet<Data>(new[] { init }), limit)) Console.WriteLine("X=" + _.X + " Y=" + _.Y);
            Console.ReadLine();
        }
Добавлено через 16 минут
Цитата Сообщение от dracon4ik Посмотреть сообщение
знак только в 64 строчке <=
Увидел ваш код. Ну что тут скажешь. Скажу пару слов, ведь я могу писать свое мнение на форуме вроде как.
1 На мой взгляд, извините, код типичного параноика производительности из с++, некоторые в конце концов опускаются до ассемблера. Копаются в дебрях (своих же в том числе) много много часов.
Вам бы лучше было программировать на с++, там вы нашли бы по духу таких же.

2 Совершенно нечитабельно, Pascal Casing не соблюдается, camelCasing тоже, правила именования также, поддержка такого кода будет невозможна, даже автором месяца через 3, про чужих людей вообще речи быть не может.
Будь моя воля, я бы таких с работы выгонял еще на стадии собеседования.

3 Не хотел оскорбить, но вы наверно не знаете, что чем производительней код, тем он более запутанный, тем более опущен на уровень ассемблера, а в наше время производительность далеко на узкое место, более того, главное читабельность и скорость разработки - вы зря программируете на C# ибо в нем именно на это делается упор, и поддержка, долгосрочная поддержка.

Если что не так извиняйте, не хотел обидеть.
1
06.01.2014, 03:59

Не по теме:

Я пока что только в 11 классе. С радостью постараюсь устранить эти пробелы в моем образовании - вы не подскажите где можно про все это почитать и желательно на русском? Попытки выиграть на производительности - попытки подготовки к олимпиаде по информатике.

0
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
06.01.2014, 04:08
Цитата Сообщение от dracon4ik Посмотреть сообщение
Я пока что только в 11 классе. С радостью постараюсь устранить эти пробелы в моем образовании - вы не подскажите где можно про все это почитать и желательно на русском? Попытки выиграть на производительности - попытки подготовки к олимпиаде по информатике.
Основы по C# много книг на русском, (Рихтер, Нейгел) в интернете поищите, там будет полностью все описано.
Талант у вас есть, это самое главное, не каждый бы решил подобную задачу. Мне тоже пришлось повозиться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2014, 04:08

Написать программу поиска максимального элемента массива с помощью рекурсии и обычной функции
Здравствуйте. Мне нужно написать программу поиска максимального элемента массива с помощью рекурсии и обычной функции. Вроде как я сделал,...

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

Есть плитка n на n, но в правом верхнем углу одна клетка вырезана и в левом нижнем тоже. Написать программу, которая поределяет, можно ли на неё разло
Есть плитка n на n, но в правом верхнем углу одна клетка вырезана и в левом нижнем тоже. Написать программу, которая поределяет, можно ли...

С помощью цикла For напишите программу, выводящую все нечетные числа из диапазона 1..100
С помощью цикла For напишите программу, выводящую все нечетные числа из диапазона 1..100.

С помощью рекурсии разработать программу для вычисления заданных сумм
Задано натуральное n. Разработать программу для вычисления заданных сумм. При расчете сумм использовать рекурсивные процедуры или функции.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru