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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
YoungProgram
 Аватар для YoungProgram
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 17
07.06.2013, 15:42     Задача о 8 ферзях #1
Условие задачи:
Решить задачу о восьми ферзях и вывести в текстовый файл несколько вариантов решения.
Смог сделать только, чтобы программа находила один вариант решения, а как сделать чтобы находило несколько вариантов?
Помогите пожалуйста.
Вот то, что получилось :
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++ Задача о пяти ферзях
C++ Задача о 8 ферзях
Ошибка в задаче о восьми ферзях C++
Задача о 8 ферзях C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.06.2013, 16:08     Задача о 8 ферзях #2
неоптимальное решение. Зачем в функциях SetChess и resetChess бегать циклом 8 раз? Это в 8 раз замедляет программу.
VirchKS
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 6
07.06.2013, 17:11     Задача о 8 ферзях #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
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.06.2013, 18:33     Задача о 8 ферзях #4
ты это сам то запускал? Или от балды написал?

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

C++ Задача о восьми ферзях

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

Или воспользуйтесь поиском по форуму:
YoungProgram
 Аватар для YoungProgram
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 17
09.06.2013, 15:23  [ТС]     Задача о 8 ферзях #10
Спасибо огромное! Разобрался)
Yandex
Объявления
09.06.2013, 15:23     Задача о 8 ферзях
Ответ Создать тему
Опции темы

Текущее время: 07:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru