Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2014, 11:27   #1
Wysler
Пользователь
 
Регистрация: 30.10.2014
Сообщений: 14
По умолчанию Как модифицировать поиск с возвратом на си

Собственно мне нужно, чтобы при расстановке ферзей на доске уже стоявшие там не трогались. Т.е. есть файл с расстановкой ферзей, который я читаю в двумерный массив. Два ферзя там уже стоят. Затем я проверяю бьют ли они друг друга. Если нет, то нужно доставить остальные 6. Сейчас у меня программа просто выводит все возможные комбинации расстановки ферзей.
Код:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#define N 8
int mas[N][N];

int test(int a, int b)
{
	//Проверка на наличие ферзя сверху
    for(int i=0;i<a;i++)
		if(mas[i][b]) return 0;
    //Проверка на наличие ферзя слева
	for(int i=0;i<b;i++)
		if(mas[a][i]) return 0;
    //Проверка на наличие ферзя на левой верхней диагонали
    for(int i=1;i<=a&&b-i>=0;i++)
		if(mas[a-i][b-i]) return 0;
    //Проверка на наличие ферзя на правой верхней диагонали
    for(int i=1;i<=a&&b+i<N;i++)
		if(mas[a-i][b+i]) return 0;
    return 1;
}
int set(int a)
{
	if(a==N) 
	{
		for(int i=0;i<N;i++)
		{
			printf("\n");
			for(int j=0;j<N;j++)
				printf("%d",mas[i][j]);
        
		}
		system("pause");
	}
	for(int i=0;i<N;i++) //Думаю тут нужно что-то изменить чтобы
                                     //учитывались ферзи                           
	{
		if(test(a,i))
		{
			mas[a][i]=1;
			set(a+1);
			mas[a][i]=0;
		}
	}
	return 0;
}

int main (void)
{
	setlocale(LC_ALL,"Russian");
	FILE *in;
	int i,j;
	if((in=fopen("c:\\input.txt","r+"))==NULL) {printf("Ошибка при открытии файла");exit(1);}
	//Чтение из файла в двумерный массив и вывод на экран
	for(i=0;i<N;i++)
	{
		printf("\n");
		for(j=0;j<N;j++)
        {
			fscanf(in,"%d",&mas[i][j]);
			printf("%d",mas[i][j]);
        }
	}
	
	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			if(mas[i][j])
				if(!test(i,j)) {printf("Ферзи бьют друг друга");system("pause");exit(1);}
	printf("Ферзи не бьют друг друга\n\n");
	set(0);
	printf("\n");
	system("pause");
	return 0;
}
Может можно как-то проще?Пишите любые советы.Спасибо.
Wysler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как модифицировать PNGImage hon Мультимедиа в Delphi 2 08.01.2013 22:59
Как модифицировать меню? invertor Общие вопросы C/C++ 5 08.01.2013 20:47
рекурсивный поиск с возвратом mego4el Помощь студентам 0 25.04.2011 22:45
поиск с возвратом Electr0Fly Помощь студентам 0 28.03.2011 15:44
Раскраска графа(поиск с возвратом) Electr0Fly Помощь студентам 0 22.03.2011 01:58