Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
rktn
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 41
#1

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

28.11.2011, 18:12. Просмотров 1032. Ответов 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 ладей так, чтобы они не били друг друга (C#):

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

.NET 4.x Комбинаторика: расставить 8 ферзей на шахматной доске - C#
Помогите оптимизировать проверку на битьё. static Int64 kol_vo = 0; static int a; static bool Checked(int...

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

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

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

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

5
SpawnDDR
160 / 156 / 4
Регистрация: 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
160 / 156 / 4
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 21:33
Привет! Вот еще темы с ответами:

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

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

Число способов расставить на шахматной доске NxN K ладей так, чтобы они не били друг друга - Delphi
Требуется найти число способов расставить на шахматной доске NxN K ладей так, чтобы они не били друг друга. Все ладьи считаются...

Рекурсия: На шахматной доске расставить 8 ферзей так, чтобы они не били друг друга - VBA
Всем привет. Прошу помочь в решении задачи в VBA c помощью рекурсии. Задача: На шахматной доске расставить 8 ферзей так, чтобы они не...


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

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

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