0 / 0 / 1
Регистрация: 29.11.2016
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
на шахматной доске (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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2017, 17:15
Ответы с готовыми решениями:

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

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

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

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

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
07.04.2017, 19:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2017, 19:38
Помогаю со студенческими работами здесь

Дано шахматное поле, расставить n ферзей так чтобы они не били друг друга
Здраствуйте, программисты! У меня случилась беда и я не знаю к кому больше обратиться.... у меня...

Задача про ферзей (расставить n ферзей так, чтобы они не били друг друга)
помогите,пожалуйста,с задачей, битый час сижу над ней-ничего не получается:пользователь задает...

Расставить на стандартной 64-клеточной доске 8 ферзей так, чтобы ни один из них не находился под боем другого
Расставить на стандартной 64-клеточной доске 8 ферзей так, чтобы ни один из них не находился под...

Расставить на доске максимальное число ферзей так, чтобы каждый из них нападал ровно на р ферзей
3. Расставить на доске N×N максимальное число ферзей так, чтобы каждый из них нападал ровно на р...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru