Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
НикНэйм
0 / 0 / 1
Регистрация: 29.11.2016
Сообщений: 11
1

Рекурсия: расставить 5 ферзей так, чтобы все поле 8*8 находилось под ударом

06.04.2017, 17:15. Просмотров 1041. Ответов 1
Метки нет (Все метки)

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


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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// 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;
//перебираем все возможные расстановки первого ферзя, чтобы найти удачную
 
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;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2017, 17:15
Ответы с готовыми решениями:

Расставить на шахмотной доске 5 ферезей так, чтобы каждая клетка находилась под ударом.
Помагите решить задачу пожайлуста.Очень надо! Надо расставить на шахмотной доске 5 ферезей так...

Определить, какими пешками можно совершить ход, чтобы черный король не был под ударом ферзей
Задана шахматная доска, содержащая черного короля, черные пешки и белых ферзей. Определить, какими...

Расставить на доске N ферзей так, чтобы они не били друг друга
смысл в том чтобы расставить на шахматной доске размером N*N, N ферзей так, чтобы они не били друг...

Рекурсия: расставить на доске 12 коней так, чтобы они не били друг друга, но при этом пробивали все остальные поля
На шахматной доске расставить 12 коней так, чтобы они не били друг друга, но при этом пробивали все...

Какое минимальное количество слонов можно расставить на шахматной доске так, чтобы они били все поле
Cлоники ограничение по времени на тест: 2 секунды ограничение по памяти на тест: 64 мегабайта...

1
НикНэйм
0 / 0 / 1
Регистрация: 29.11.2016
Сообщений: 11
07.04.2017, 19:38  [ТС] 2
Ребята, спасибо, если кто-то хотел помочь.. Я нашла ошибку, кидаю правильную прогу, может кому-то пригодится)


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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// 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;
}
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2017, 19:38

Расставить на шахматной доске 8 ферзей так, чтобы не один не попадал под удар. Вывести все комбинации
Расставить на шахматной доске 8 ферзей так, чтобы не один не попадал под удар. Вывести все...

Определить наименьшее количество ферзей, которые можно расставить так, чтобы они держали под боем все ее свободные поля
Ребята, помогите с такой проблемкой. Нужно написать программу, которая будет определять наименьшее...

Рекурсия: На шахматной доске расставить 8 ферзей так, чтобы они не били друг друга
Всем привет. Прошу помочь в решении задачи в VBA c помощью рекурсии. Задача: На шахматной доске...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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