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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2017, 16:25   #1
Notaenvilli
Новичок
Джуниор
 
Регистрация: 06.04.2017
Сообщений: 2
По умолчанию [РЕШЕНО]: Рекурсия, C++, расставить 5 ферзей на шахматном поле (8*8)

Задача: расставить 5 ферзей на шахматном поле (8*8) так, чтобы каждая клетка находилась под ударом. Моя программа написана неверно, не могу найти ошибку, помогите, пожалуйста
Код:
// ConsoleApplication45.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

void func_1(int**mas, int x, int y, int n, int &k)
{ 
	k++;
	mas[x][y]=-1;
	for(int i=0; i<n; i++)
			{
				if (mas[i][y]!=-1)   mas[i][y]++;
				if (mas[x][i]!=-1)   mas[x][i]++;
				int z=y-x+i;
				if((z>=0) && (z<n))  if(mas[i][z]!=-1)       mas[i][z]++;
				int l=y+x-i;         
				if((l>=0) && (l<n))  if(mas[i][l]!=-1)       mas[i][l]++;

		    }
}


void func_3(int**mas, int x, int y, int n, int &k)
{
	mas[x][y]=0;
  k--;
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
		{
			    if (mas[i][y]!=-1)   mas[i][y]--;
				if (mas[x][i]!=-1)   mas[x][i]--;
				int z=y-x+i;
				if((z>=0) && (z<n))  if(mas[i][z]!=-1)       mas[i][z]--;
				int l=y+x-i;         
				if((l>=0) && (l<n))  if(mas[i][l]!=-1)       mas[i][l]--;

		    }
}
bool func_2 (int **mas, int x, int y, int n, int &k)
			{
				func_1(mas, x, y, n, k);
				if (k==5)
					{
						for(int i=0; i<n; i++)
                        for(int j=0; j<n; j++)
						{
                             if (mas[i][j]==0)
							{	
								func_3(mas, x, y, n, k);
								return false;
							}
						}
				       
							return true;
			      	}
				
				
				        for(int i=0; i<n; i++)
					    for(int j=0; j<n; j++)
						{
							if(mas[i][j]==0)
						
								if(func_2(mas, i, j, n, k))
									return true;
						}
						
							func_3(mas, x, y, n, k);
							return false;
					
							}	

int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "rus");

//создаем массив нулевых элементов

const int n=8;
int **mas = new int *[n];
for(int i=0; i<n; i++)
	mas[i] = new int[n];

for(int i=0; i<n; i++)
	for(int j=0; j<n; j++)
		mas[i][j]=0;

//создаем переменную, которая будет обозначать количество ферзей
int k=0;
//перебираем все возможные расстановки первого ферзя, чтобы найти удачную

for(int i=0; i<n; i++)
	for(int j=0; j<n; j++)
	
		if (func_2(mas, i, j, n, k))
				break;
		

        //выводим массив
 for(int i=0; i<n; i++)
 {
	  cout<<'\n';
	 for(int j=0; j<n; j++)
		 cout<<mas[i][j]<<" ";
 }
 cout<<k;

system("pause");
	return 0;
}
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

_____________________________

Решение в сообщении ниже

Последний раз редактировалось Вадим Мошев; 12.05.2018 в 13:23.
Notaenvilli вне форума Ответить с цитированием
Старый 07.04.2017, 19:44   #2
Notaenvilli
Новичок
Джуниор
 
Регистрация: 06.04.2017
Сообщений: 2
По умолчанию

Ребята, спасибо, если кто-то хотел помочь (а не просто равнодушно пролистнул..).. Я нашла ошибку в своей проге, кидаю правильную, может кому пригодится))


Код:
// ConsoleApplication45.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

void func_1(int**mas, int x, int y, int n, int &k)
{ 
	k++;
	mas[x][y]=-1;
	for(int i=0; i<n; i++)
			{
				if (mas[i][y]!=-1)   mas[i][y]++;
				if (mas[x][i]!=-1)   mas[x][i]++;
				int z=y-x+i;
				if((z>=0) && (z<n))  if(mas[i][z]!=-1)       mas[i][z]++;
				int l=y+x-i;         
				if((l>=0) && (l<n))  if(mas[i][l]!=-1)       mas[i][l]++;

		    }
}


void func_3(int**mas, int x, int y, int n, int &k)
{
	mas[x][y]=0;
  k--;
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
		{
			    if ((mas[i][y]!=-1)&&(mas[i][j]!=0))    mas[i][y]--;
				if ((mas[x][i]!=-1)&&(mas[i][j]!=0))    mas[x][i]--;
				int z=y-x+i;
				if((z>=0) && (z<n))  if((mas[i][z]!=-1)&&(mas[i][j]!=0))        mas[i][z]--;
				int l=y+x-i;         
				if((l>=0) && (l<n))  if((mas[i][l]!=-1)&&(mas[i][j]!=0))        mas[i][l]--;

		    }
}

bool func_2 (int **mas, int x, int y, int n, int &k)
			{
				func_1(mas, x, y, n, k);
				if (k==5)
					{
						for(int i=0; i<n; i++)
						{
                        for(int j=0; j<n; j++)
						{
                             if (mas[i][j]==0)
							{	
								func_3(mas, x, y, n, k);
								return false;
							}
						  }
						}

							return true;
			      	}
				else
				{				
				        for(int i=0; i<n; i++)
						{
					    for(int j=0; j<n; j++)
						{
							if(mas[i][j]==0)
						
								if(func_2(mas, i, j, n, k))
									return true;
						}
						}
							func_3(mas, x, y, n, k);
							return false;
					
							}
}

int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "rus");

//создаем массив нулевых элементов

const int n=8;
int **mas = new int *[n];
for(int i=0; i<n; i++)
	mas[i] = new int[n];

for(int i=0; i<n; i++)
	for(int j=0; j<n; j++)
		mas[i][j]=0;

//создаем переменную, которая будет обозначать количество ферзей
int k=0;
//перебираем все возможные расстановки первого ферзя, чтобы найти удачную

bool flag = true;

for(int i=0; i<n; i++)
 if (flag)
 {
   for(int j=0; j<n && flag; j++)
   {
		if (func_2(mas, i, j, n, k)&&(flag))
			flag = 0;

	}
}

        //выводим массив
 for(int i=0; i<n; i++)
 {
	  cout<<'\n';
	 for(int j=0; j<n; j++)
		 cout<<mas[i][j]<<" ";
 }
 cout<<k;

system("pause");
	return 0;
}

Последний раз редактировалось Вадим Мошев; 12.05.2018 в 13:24.
Notaenvilli вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Установить на шахматной доске минимум ферзей (первоначально 8), чтобы каждое поле было под боем pyxamex Паскаль, Turbo Pascal, PascalABC.NET 0 29.05.2014 13:57
Заполнить массив в шахматном порядке stas135642 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 20.06.2011 01:21
Какое наимньшее число ферзей можно расставить на доске так, чтобы они держали под бонм все свободные поля alykaa Помощь студентам 4 01.12.2010 18:48