Kenneth C. Santiañez Ответов: 2

Программа N queen: пользователь-это тот, кто будет вводить строку и столбец позиции queen


В этой программе пользователь должен сам вводить строку и столбец королевы на каждой итерации, и, к счастью, мне это удалось. Проблема в том, что на каждой итерации ферзя должна быть функция, которая будет проверять, безопасно ли размещать строку и столбец или нет. Функция должна проверить по вертикали, горизонтали и диагонали, существует ли ферзь, если да, то появится сообщение о том, что ферзь существует, и вернется на текущий счетчик ферзя. Это то, что я сделал до сих пор. Любая помощь очень ценится, спасибо.

#include<stdio.h>
#include<math.h>
int i, j,n;
int a[20][20];
int row, col;
main()
{
	clrscr();
	printf("Enter no. of queen(s): ");
	scanf("%d",&n);

	print_board();

	for(i=1;i<=n;i++)
	{
		printf("\n\nPosition of Queen %d",i);
		printf("\n\tRow: ");
		scanf("%d",&row);
		printf("\tColumn: ");
		scanf("%d",&col);

		if(safeToPlace(row,col) == 1)
		{
			place_Queen(row,col);
		}

	}
	print_Array();


getch();
}

int print_board()
{
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			a[i][j] = '-';
		}
	}

}

int print_Array()
{
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%c\t",a[i][j]);
		}
	printf("\n\n");
	}
printf("\n");
}

int place_Queen(int row, int col)
{
	a[row][col] = 'Q';
}

/* The function were I got the problem */
int safeToPlace(int row, int col)
{
	int i, j, flag;
	for(i=1;i<=row;i++)
	{
		for(j=1;j<=n;j++)
		{
			int k = abs(row - i);
			int l = abs(col - n);
			if(a[i][col] != 'Q' && a[k][l] != 'Q')
			{
				flag =1;
			}
			else
			{
				flag =0;
				break;
			}
		}
	}
	return flag;
}



Что я уже пробовал:

Я попробовал поискать в гугле и понял, в чем дело. Но с другой стороны, программа N Queen сильно отличается, потому что строка и столбец должны быть введены пользователем.

[no name]

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

[no name]

Сообщение обновлено уже 5 раз, и до сих пор нет никаких признаков реального вопроса.

2 Ответов

Рейтинг:
2

Patrice T

Мы не делаем вашу домашнюю работу.
Домашнее задание не предназначено для проверки ваших навыков просить других людей выполнять вашу работу, оно предназначено для того, чтобы помочь вашему учителю проверить ваше понимание пройденных вами курсов, а также проблем, возникающих при их применении.
Любая ваша неудача поможет учителю выявить ваши слабости и наметить меры по их исправлению.
Итак, перечитайте свои уроки и приступайте к работе. Если вы застряли на конкретной проблеме, покажите свой код и объясните эту точную проблему, мы можем помочь.

[Обновление]
Вы должны возвращать что-то в функциях, которые не имеют типа void.


Рейтинг:
12

PeejayAdams

Вы пытаетесь делать три вещи одновременно, что никогда не бывает хорошей идеей.

По сути вам нужно знать ответ на три вопроса:

Есть ли королева в той же колонне?
Есть ли королева в том же ряду?
Есть ли королева на диагонали?

Наилучший подход заключается в том, чтобы писать отдельные методы для тех, поэтому ваш SafeToPlace() может тогда выглядеть примерно так:

if (QueensInColumn() == 0 && QueensInRow() == 0 && QueensOnDiagonal() == 0)
     return 1;

return 0;


Есть очень много преимуществ разбиения кода на отдельные элементы (вы, вероятно, когда-нибудь столкнетесь с принципом единой ответственности), не в последнюю очередь потому, что это значительно облегчает отладку вашего кода. В этом примере, если он продолжает ошибаться для диагонали, но работает для строк и столбцов, вы точно знаете, где искать, и вы не обнаружите, что меняете биты, которые уже работают.

Еще один совет для облегчения отладки (и в целом лучшего кода) - использовать более значимые имена переменных. Использование меток типа a, i, j, k, l и т. д. делает ваш код очень трудным для чтения, а код, который трудно читать, трудно поддерживать.

В-третьих, вы, похоже, пытаетесь применить индексы на основе 1 к языку индексов на основе 0 и сбиваете себя с толку в этом процессе. 0-основание всего, и все должно стать немного яснее.