Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
rktn
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 41
1

Рекурсия: расставить на шахматной доске 8 ладей так, чтобы они не били друг друга

28.11.2011, 18:12. Просмотров 1236. Ответов 5
Метки нет (Все метки)

Нужно расставить на шахматной доске 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2
{
    class Program
    {
 
        static void FillBoard(int[,] board) // заполняем доску нулями
        {
            for (int i = 0; i < 8; i++)
                for (int j = 0; j < 8; j++)
                    board[i, j] = 0;
        }
 
        static int Sum(int i, int[,] board) // поиск суммы элементов строки (пригодится далее)
        {
            int sum = 0;
            for (int j = 0; j < 8; j++)
                sum = sum + board[i, j];
            return sum;
        }
 
        static void PlaceRook(Random r, int j, int[,] board) // ставим ладью
        {
            int i = r.Next(0, 7);
            board[i, j] = 1; // ставим ладью на рандомную клетку в столбце (обозначаем "1")
            if (j > 0 && Sum(i,board) > 1) // проверка на единственность ладьи в строке
                PlaceRook(r, j, board); // если ладья в строке не единственная, пытаемся ее поставить в этом столбце заново
            if (j + 1 < 8)
                PlaceRook(r, j + 1, board); // рекурсия
        }
 
        static void Main(string[] args)
        {
            int j = 0;
            Random r = new Random();
            int[,] board = new int[8, 8];
            FillBoard(board);
            PlaceRook(r, 0, board);
            for (int i = 0; i < 8; i++)
            {
                for (j = 0; j < 8; j++)
                    Console.Write(board[i, j]);
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}
В таком варианте получается бесконечная рекурсия. Если убрать проверку, то все работает, но ладьи бьют друг друга. Мб я неправильно сделал ее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 18:12
Ответы с готовыми решениями:

Расстановка 8 ладей на шахматной доске (рекурсивно)
Народ, помогите пожалуйста с этой проблемой. Всё сделал. Работает, но вот...

Комбинаторика: расставить 8 ферзей на шахматной доске
Помогите оптимизировать проверку на битьё. static Int64 kol_vo = 0; ...

На шахматной доске расставить восемь ферзей
на шахматной доске расставить восемь ферзей так,чтобы каждые два из них,не...

Програма на шахматной доске расставила восемь ферзей так, чтобы каждые два из них, не находились под одним столбиком
нужно на написать програму на C#, чтоб програма на шахматной доске расставила...

Сделать так, чтобы объекты по бокам экрана расставлялись рандомно, но на расстоянии друг от друга
Привет. Работаю в Unity. Мне нужно сделать так, чтобы объекты по бокам экрана...

5
SpawnDDR
161 / 157 / 19
Регистрация: 22.11.2011
Сообщений: 371
28.11.2011, 18:23 2
Может речь про ферзей?
Ладьи при подобных условиях просто на диагональ встают...
0
rktn
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 41
28.11.2011, 19:54  [ТС] 3
не только на диагональ, поэтому и заполняю рандомом

Добавлено через 1 час 27 минут
апд: ошибка stackoverflow оказывается ~~
0
SpawnDDR
161 / 157 / 19
Регистрация: 22.11.2011
Сообщений: 371
28.11.2011, 20:12 4
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
using System;
 
namespace ConsoleTest
{
    class Program
    {
        static int[,] field = new int[8, 8];
        static void Main(string[] args)
        {
            Random rnd = new Random();
            int num = rnd.Next(0, 8);
            for (int i = 0; i < field.GetLength(0); i++)
            {
                while (!EmptyLine(num))
                    num = rnd.Next(0, 8);
                field[num, i] = 1;
            }
            Print();
            Console.ReadKey();
 
        }
 
        static void Print()
        {
            for (int i = 0; i < field.GetLength(0); i++)
            {
                for (int j = 0; j < field.GetLength(1); j++)
                    Console.Write(field[i, j] + "\t");
                Console.WriteLine();
            }
        }
 
        static bool EmptyLine(int num)
        {
            for (int i = 0; i < field.GetLength(1); i++)
                if (field[num, i] == 1)
                    return false;
            return true;
        }
    }
}
Добавлено через 56 секунд
Для ферзей было бы повеселее...
1
rktn
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 41
28.11.2011, 20:19  [ТС] 5
да я уже сам нашел пошагово отлаживал программу, пока не понял что диапазон рандома на единицу меньше чем надо сделал
0
DimanRu
28.11.2011, 21:33     Рекурсия: расставить на шахматной доске 8 ладей так, чтобы они не били друг друга
  #6

Не по теме:

Дожили... 8 ладей на доске!!!%-)

0
28.11.2011, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 21:33
Привет! Вот еще темы с ответами:

Дана шахматная доска NxN как поставить на ней N ферзей чтоб они не рубили друг друга
Дана шахматная доска NxN как поставить на ней N ферзей чтоб они не рубили друг...

Расставить сложение и вычитание так чтобы получилось 100
Задание таково: Есть числа от 1 до 9 или от 9 до 1, без разницы. Надо сделать...

Можно ли из чисел составить пары чисел, чтобы они обозначали поля шахматной доски одного цвета
Даны натуральные k, l, m, n , каждое из которых не превосходит восьми. Выяснить...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru