Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
YoungProgram
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 17
#1

Задача о 8 ферзях - C++

07.06.2013, 15:42. Просмотров 1889. Ответов 9
Метки нет (Все метки)

Условие задачи:
Решить задачу о восьми ферзях и вывести в текстовый файл несколько вариантов решения.
Смог сделать только, чтобы программа находила один вариант решения, а как сделать чтобы находило несколько вариантов?
Помогите пожалуйста.
Вот то, что получилось :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <iostream.h>
using namespace std;
 
int board[8][8];
 
void setChess(int i, int j)
{
for (int x=0;x<8;x++)
{
++board[x][j];
++board[i][x];
int diag;
diag=j-i+x;
if(diag>=0 && diag<8)
++board[x][diag];
diag = j+i-x;
if(diag>=0 && diag<8)
++board[x][diag];
}
board[i][j] = -1;
}
 
void resetChess(int i, int j)
{
for (int x=0;x<8;x++)
{
--board[x][j];
--board[i][x];
int diag;
diag=j-i+x;
if(diag>=0 && diag<8)
--board[x][diag];
diag = j+i-x;
if(diag>=0 && diag<8)
--board[x][diag];
}
board[i][j] = 0;
}
 
 
bool tryChess(int i)
{
bool result = false;
for(int j=0;j<8;j++)
{
if (board[i][j] == 0)
{ setChess(i, j);
  if (i==7)
  result = true;
  else
  {
  if(!(result = tryChess(i+1)))
  resetChess(i, j);
  }
  }
if (result)
break;
}
return result;
}
int main()
{
for(int i=0;i<8;i++)
for( int j=0;j<8;j++)
board[i][j] = 0;
tryChess(0);
for(int i=0;i<8;i++)
{
for( int j=0;j<8;j++)
{
if(board[i][j] == -1)
cout<<"Ф";
else cout <<".";
}
cout<< endl;
getchar();
getchar();
}
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 15:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача о 8 ферзях (C++):

Задача о 8 ферзях - C++
Помогите, пожалуйста, подсчитать сколько будет сделано возвратов return 0; в фукнцию char check(int*A, int n) Как поставить...

Задача о 8 ферзях - C++
вывести в файл все 92 возможных варианта(в виде матрицы, где расположение ферзя означает единицу, а пустые клетки 0) расстановки 8 ферзей...

Задача о ферзях - C++
Пожалуйста, помогите решить задачу. Дана шахматная доска размерностью N на N ( 1&lt;= N &lt;=10). Необходимо вывести количество способов,...

Задача о 8 ферзях - C++
Уважаемые программисты помогите, отблагодарю как смогу.Листинг программы есть.Нужно сделать так чтобы возможных вариантов решения было 12. ...

Задача о 8 ферзях - C++
Условие ЗАДАЧи : В программе о восьми ферзях (рекурсивной) подсчитайте, сколько было сделано возвратов назад. Помогите, пожалуйста, в...

Задача о 8 ферзях рекурсивно - C++
нашел код, помогите сделать его рекурсивно а не поиском с возвратом позиций #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;time.h&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.06.2013, 16:08 #2
неоптимальное решение. Зачем в функциях SetChess и resetChess бегать циклом 8 раз? Это в 8 раз замедляет программу.
VirchKS
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 6
07.06.2013, 17:11 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int i=1;
for(int a=1;a<9;a++)
for(int b=1;b<9;b++)
if (b!=a)
if (abs(b-a)!=1)
for(int c=1;c<9;c++)
if ((c!=a)and(c!=b))
if ((abs(c-b)!=1)and(abs(c-a)!=2))
for(int d=1;d<9;d++)
if ((d!=a)and(d!=b)and(d!=c))
if ((abs(d-c)!=1)and(abs(d-b)!=2)and(abs(d-a)!=3))
for(int e=1;e<9;e++)
if ((e!=a)and(e!=b)and(e!=c)and(e!=d))
if ((abs(e-d)!=1)and(abs(e-c)!=2)and(abs(e-b)!=3)and(abs(e-a)!=4))
for(int f=1;f<9;f++)
if ((f!=a)and(f!=b)and(f!=c)and(f!=d)and(f!=e))
if ((abs(f-e)!=1)and(abs(f-d)!=2)and(abs(f-c)!=3)and(abs(f-b)!=4)and(abs(f-a)!=5))
for(int g=1;g<9;g++)
if ((g!=a)and(g!=b)and(g!=c)and(g!=d)and(g!=e)and(g!=f))
if ((abs(g-f)!=1)and(abs(g-e)!=2)and(abs(g-d)!=3)and(abs(g-c)!=4)and(abs(g-b)!=5)and(abs(g-a)!=6))
for(int h=1;h<9;h++)
if ((h!=a)and(h!=b)and(h!=c)and(h!=d)and(h!=e)and(h!=f)and(h!=g))
if ((abs(h-g)!=1)and(abs(h-f)!=2)and(abs(h-e)!=3)and(abs(h-d)!=4)and(abs(h-c)!=5)and(abs(h-b)!=6)and(abs(h-a)!=7))
{
   cout<<i<<": a"<<a<<"; b"<<b<<"; c"<<c<<"; d"<<d<<"; e"<<e<<"; f"<<f<<"; g"<<g<<"; h"<<h<<"."<<std::endl;i++;}
}
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.06.2013, 18:33 #4
ты это сам то запускал? Или от балды написал?

and ... ты это либо с оператором && перепутал, либо вообще Си не изучал!
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
07.06.2013, 18:37 #5
YoungProgram, Ошибка в задаче о восьми ферзях
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.06.2013, 18:46 #6
Расставить 8 ферзей на шахматной доске 8 на 8, которые не бьют друг друга
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.06.2013, 18:47 #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
and ... ты это либо с оператором && перепутал, либо вообще Си не изучал!
http://en.cppreference.com/w/cpp/keyword/and
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.06.2013, 18:55 #8
Цитата Сообщение от diagon Посмотреть сообщение
Охренеть! А нахрена?
Там ещё про какие-то триграфы написано... вот зачем усложнять и без того сложный язык?
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.06.2013, 19:05 #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
вот зачем усложнять и без того сложный язык?
Чтобы программистам на этом языке больше платили.
Ну и чисто субъективно and выглядит послаще.
Ну и еще оно позволяет записать любую с++ программу в сильно специфичной 7-битной кодировке (подробности есть где-то в ссылке выше).
YoungProgram
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 17
09.06.2013, 15:23  [ТС] #10
Спасибо огромное! Разобрался)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 15:23
Привет! Вот еще темы с ответами:

Задача о восьми ферзях - C++
Есть у меня массив из 8 случайных чисел от 0 до 7. Мне нужно найти количество атакующих друг друга пар ферзей. Моя функция вроде считает,...

Задача о пяти ферзях - C++
Добрый Вечер!!:) Помогите Пожалуйста решить задачу: Найдите такую расстановку пяти ферзей на шахматной доске, при которой каждое поле будет...

Задача о 8 ферзях: сколько было сделано возвратов назад - C++
Помогите переделать код под условие задачи. Условие задачи: В программе о восьми ферзях (рекурсивной) подсчитайте, сколько было...

О 8 ферзях(Без рекурсии) - C++
Пытаюсь сделать задачу о 8 ферзях без рекурсии. Сделал набросок, но работает как то криво. В чем проблема? #include &lt;stdlib.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.06.2013, 15:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru