Задача с шахматным конем. Конь - не простой...


//Путь коня по шахматной доске
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>


int N; // размер доски

int desk[156][156]; // поля доски
int nstep; // номер шага1
int best;
int numeration[8]={0,1,2,3,4,5,6,7};//нумерация лучших ходов
static int xy[8][2] = {{ 3,1},{ 3,-1},{1,-3},{-1,-3},{ -3,-1},{ -3, 1},{-1, 3},{1, 3}}; // ходы коня - возможные


void gotoxy(int xpos, int ypos) //Функция, делающая таблицу ходов.
{
COORD scrn;
HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
scrn.X = xpos; scrn.Y = ypos;
SetConsoleCursorPosition(hOuput,scrn);
}

void Print (void) //Функция, задающая "параметры" расположения таблицы ходов.

{
int i,j;
system("cls");
for (i=0; i<N; i++)
for (j=0; j<N; j++) 
{
gotoxy (j*3+1 ,i+1);
printf("%02d ", desk[i][j]);
}
}

int Best_step(int x0, int y0) 
{
int i;
int chetchick=0; // Заводим счетчик
for(i=0;i<7;i++) // Пробегаем по i от 0 до 7
if (x0+xy[i][0]>=0 && x0+xy[i][0] < N && y0+xy[i][1] >= 0 && y0+xy[i][1] < N && desk[x0+xy[i][0]][y0+xy[i][1]]==0) // Если клетка, в которую мы "сделали" ход номер i, пустая,...
chetchick++; // ...то увеличиваем счетчик на 1
return chetchick; // Наконец, возвращаем счетчик
};

int step(int x0, int y0)
{
int i; // локальный параметр - номер хода
//Print();
if (x0 < 0 || x0 >N-1 || y0 < 0 || y0 >N-1 )
return(0); // выход за пределы доски
if (desk[x0][y0] !=0)
return(0); // поле уже пройдено
desk[x0][y0] = ++nstep; // отметить свободное поле
if (nstep == N*N)
return(1); // все поля отмечены - успех
int temp;
for (int i = 0; i < 7; i++)//отсортировали возможные ходы по количеству полей, в которые можно будет попасть после совершения хода.
{
best = i;
for (int j = i+1;j<8;j++)
{
if 
(
Best_step(x0+xy[best][0],y0+xy[best][1])>Best_step(x0+xy[j][0],y0+xy[j][1])
)
best=j;
};
temp=numeration[i];
numeration[i]=numeration[best];
numeration[best]=temp;
}
for (i=0; i<8; i++)
if 
(
step(x0+xy[numeration[i]][0], y0+xy[numeration[i]][1])
)
return(1); // поиск успешного хода
nstep--; // вернуться на ход назад
desk[x0][y0] = 0; // стереть отметку поля
return(0); // последовательность не найдена
}

int Path(int x0, int y0)
{
int i,j; // очистка доски
for (i=0; i<N; i++)
for (j=0; j<N; j++) desk[i][j] =0;
nstep = 0; // установить номер шага

return step(x0,y0); // вызвать функцию для исходной позиции
}
void main (void) 
{
scanf_s("%d", &N);
int n=Path (0,0); // нумерация полей - слева и сверху, с нуля
Print();
printf ("\nRes=%d",n);
system("pause");
}

Прикол в том, что конь не обычный, а ДОЛБАН! Ходит не на две и одну клетку, а на ТРИ и одну клетку!!! Также, если ввести размерность доски меньше, чем 8 — то выводит, что не обойти — и это верно. А если 8 — то молчит, как партизан, строкой моргая...

Помогите, люди добрые!!

альтернативный текст

так у вас так и написано, что конь на три ходит
//static int xy[8][2] = {{ 3,1},{ 3,-1},{1,-3},{-1,-3},{ //-3,-1},{ -3, 1},{-1, 3},{1, 3}}; // ходы коня — возможные

the Power of JS
function fb (line) {
var answer;
var answer_line;
var horse;
var movesArr = [];
var letter = line[0];
var digit = +line[1];
fieldLetter = ['a','b','c','d','e','f','g','h'];
fieldDigit = [1, 2, 3, 4, 5, 6, 7, 8];
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) — 2] + fieldDigit[digit-2]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) — 2] + fieldDigit[digit]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) — 1] + fieldDigit[digit-3]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) — 1] + fieldDigit[digit+1]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) + 1] + fieldDigit[digit-3]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) + 1] + fieldDigit[digit+1]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) + 2] + fieldDigit[digit-2]);
movesArr.push(fieldLetter[fieldLetter.indexOf(letter) + 2] + fieldDigit[digit]);
horse = movesArr.join(' ');
answer = horse.match(/[a-h]+\d/g);
answer_line = answer.join(' ');
console.log(answer_line);
}
fb('b1');

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

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

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.