Консультация № 185743
02.04.2012, 20:36
76.16 руб.
0 2 1
Здравствуйте! Прошу помощи в следующем вопросе: дана шахматная доска размером 6x6, конь начинает движение из любой, заданной пользователем, клетки. Фигура должна обойти всю доску, побывав на каждой клетке тольо один раз. Требуется вывести координаты для каждого хода. Задачу нужно решить при помощи рекурсии.

Обсуждение

Неизвестный
02.04.2012, 23:05
общий
это ответ
Здравствуйте, Татьяна Турунжева!
Код:
using System;

namespace Application
{
class Knight
{
// Размер доски
const int Size = 6;

// Доска
int[,] board = new int[Size, Size];

// Кол-во найденных решений
private int count;

public static void Main (string[] args)
{
// Ввод данных без контроля корректности ввода.
try {
Console.Write ("Начальная клетка:");
string ans = Console.ReadLine ().Trim ().ToLower ();
int col = (int)ans[0] - (int)'a';
int row = Size - int.Parse (ans[1].ToString ());
new Knight ().Run (row, col);
} catch (Exception e) {
Console.WriteLine ("{0}", e.Message);
}
}

// Печать результата
private void Print ()
{
Console.WriteLine ("Решение №{0}:", ++count);
for (int i = 0; i < Size; ++i) {
for (int j = 0; j < Size; ++j) {
Console.Write ("|{0,2}", board[i, j]);
}
Console.WriteLine ("|");
}
}

private void Run (int col, int row)
{
count = 0;
Solve (col, row, 0);
Console.WriteLine ("Найдено {0} решений", count);
}

// Собственно, рекурсивная функция
private void Solve (int col, int row, int mov)
{
// Если можем разместить
if (IsEmptyField (col, row)) {
// Размещаем
board[col, row] = ++mov;
// Если еще есть пустые клетки
if (mov < Size * Size) {
// Перебор возможных ходов
Solve (col + 1, row + 2, mov);
Solve (col + 1, row - 2, mov);
Solve (col + 2, row + 1, mov);
Solve (col + 2, row - 1, mov);
Solve (col - 1, row - 2, mov);
Solve (col - 1, row + 2, mov);
Solve (col - 2, row - 1, mov);
Solve (col - 2, row + 1, mov);
} else {
// Все клетки заполнены. Значит есть решение
Print ();
}
// Уберем с клетки коня
board[col, row] = 0;
}
}

// Проверка возможности размещения на заданном поле
private bool IsEmptyField (int col, int row)
{
return !(col < 0 || row < 0 || col >= Size || row >= Size || board[col, row] != 0);
}
}
}

Часть вывода программы:
Код:
Начальная клетка:a1
Решение №1:
|36|17|30|25|12|15|
|31|24|13|16|29|26|
| 8|35|18|27|14|11|
|23|32| 9| 4|19|28|
|34| 7| 2|21|10| 5|
| 1|22|33| 6| 3|20|
Решение №2:
|36|17|30|25|12|15|
|31|26|13|16|29|24|
| 8|35|18|27|14|11|
|19|32| 9| 4|23|28|
|34| 7| 2|21|10| 5|
| 1|20|33| 6| 3|22|
Решение №3:
|36|17|30|19|12|15|
|31|26|13|16|29|20|
| 8|35|18|27|14|11|
|25|32| 9| 4|21|28|
|34| 7| 2|23|10| 5|
| 1|24|33| 6| 3|22|
Решение №4:
|36|17|30|19|12|15|
|31|20|13|16|29|26|
| 8|35|18|27|14|11|
|21|32| 9| 4|25|28|
|34| 7| 2|23|10| 5|
| 1|22|33| 6| 3|24|
Решение №5:
|14|29|26|33|12|31|
|27|34|13|30|25|22|
| 8|15|28|23|32|11|
|35|18| 9| 4|21|24|
|16| 7| 2|19|10| 5|
| 1|36|17| 6| 3|20|
Решение №6:
|14|27|30|23|12|25|
|29|34|13|26|31|22|
| 8|15|28|33|24|11|
|35|18| 9| 4|21|32|
|16| 7| 2|19|10| 5|
| 1|36|17| 6| 3|20|
Решение №7:
|14|29|26|33|12|31|
|27|22|13|30|25|34|
| 8|15|28|23|32|11|
|21|18| 9| 4|35|24|
|16| 7| 2|19|10| 5|
| 1|20|17| 6| 3|36|
Решение №8:
|14|27|30|23|12|25|
|29|22|13|26|31|34|
| 8|15|28|33|24|11|
|21|18| 9| 4|35|32|
|16| 7| 2|19|10| 5|
| 1|20|17| 6| 3|36|
Решение №9:
|14|25|22|33|12|27|
|23|34|13|26|21|32|
| 8|15|24|19|28|11|
|35|18| 9| 4|31|20|
|16| 7| 2|29|10| 5|
| 1|36|17| 6| 3|30|
Решение №10:
|14|25|22|33|12|27|
|23|32|13|26|21|34|
| 8|15|24|19|28|11|
|31|18| 9| 4|35|20|
|16| 7| 2|29|10| 5|
| 1|30|17| 6| 3|36|
Неизвестный
03.04.2012, 22:47
общий
Спасибо большое.
Форма ответа