Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
dimaondmersik
3 / 3 / 1
Регистрация: 13.12.2015
Сообщений: 51
#1

Поменять местами черные и белые шарики (шашки) - C++

25.11.2016, 23:22. Просмотров 318. Ответов 1
Метки нет (Все метки)

*Имеется N лунок, в которых расставлены L черных и S белых шаров. Поменять
местами черные и белые шары. Черные шары можно передвигать только вправо, а
белые - только влево. Шар передвигается в соседнюю с ним лунку (пустую) либо
в пустую лунку, находящуюся непосредственно за ближайшим шаром. Значения N, L, S
ввести (N=L+S+1)*/

Код не мой. Пытаюсь разобраться в нем. Подскажите хотя бы вообщем что в проги поэтапно происходит.
/*Имеется N лунок, в которых расставлены L черных и S белых шаров. Поменять
местами черные и белые шары. Черные шары можно передвигать только вправо, а
белые - только влево. Шар передвигается в соседнюю с ним лунку (пустую) либо
в пустую лунку, находящуюся непосредственно за ближайшим шаром. Значения N, L, S
ввести (N=L+S+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
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
#include <queue>//контейнер реализует модель очереди
#include <iostream>
#include <cstring>
#include <string>
 
using namespace std;
 
const int L= 3;// число шаров черных  и белых то есть 3-белых и 3-черных
const int S=3;
const int n = L+S+1; // Подсчет лунок ,лунки занятые шарами+лунка пустая
const char s[3] = {'_', 'S', 'L'};// обазначение шаров и пустой лунки
 
int empty = 0, black = 1, white = 2;
const int raz = 1 << (n*2);//
int d[raz];
int from[raz];
queue<int> q;
int curss = 0, start = 0, finish = 0;
 
void set(int &curss, int pos, int val)
{
    pos <<= 1;
    curss &= ~((1 << pos)|(1 << (pos+1)));
    curss |= val << pos;
}
 
int get(int curss, int pos)
{
    pos <<= 1;
    return (curss >> pos) & 3;
}
 
void print(int curss)//
{
    for(int i = 0; i < n; i++)
    {
        cout << s[curss&3];
        curss >>= 2;
    }
}
 
void tryy(int next)
{
    if(d[next] == -1)
    {
        q.push(next);
        d[next] = d[curss]+1;
        from[next] = curss;
    }
}
 
int main()
 
{
 
    cout << "kolvo lunok = "<<n<<endl;
 
    cout << "L- chernyi shar, S-belyi shar, _ - pustay lunka,"<<endl; //ВЫВОД ПОЯСНЕНИЙ НА ЭКРАН
    cout << "kolvo L = "<<L<<endl;//вывод на экран кол-во черных шаров
    cout << "kolvo S = "<<S<<endl;//вывод на экра нкол-во белых шаров
    for(int i = 0; i < S; i++)
    {
        set(start,i,black);
        set(finish,i,white);
    }
    //set(start,n,empty);
    //set(finish,n,empty);
    for(int i = S+1; i < n; i++)
    {
        set(start,i,white);
        set(finish,i,black);
    }
 
    memset(d,-1,sizeof(d));
 
    d[start] = 0;
    from[start] = -1;
    q.push(start);
 
 
    while(true)
    {
        curss = q.front();
        q.pop();
        if(curss == finish)
        {
            while(curss != -1)
            {
                print(curss);
                cout << endl;
                curss = from[curss];
            }
            break;
        }
        for(int i = 0; i < n-1; i++)
        {
            int t = get(curss,i);
            if(t != empty && get(curss,i+1) == empty)
            {
                int next = curss;
                set(next,i,empty);
                set(next,i+1,t);
                tryy(next);
            }
        }
 
        for(int i = 1; i < n; i++)
        {
            int t = get(curss,i);
            if(t != empty && get(curss,i-1) == empty)
            {
                int next = curss;
                set(next,i,empty);
                set(next,i-1,t);
                tryy(next);
            }
        }
 
        for(int i = 0; i < n-2; i++)
        {
            int t = get(curss,i);
            if(t != empty && get(curss,i+1) != empty && get(curss,i+2) == empty)
            {
                int next = curss;
                set(next,i,empty);
                set(next,i+2,t);
                tryy(next);
            }
        }
 
        for(int i = 2; i < n; i++)
        {
            int t = get(curss,i);
            if(t != empty && get(curss,i-1) != empty && get(curss,i-2) == empty)
            {
                int next = curss;
                set(next,i,empty);
                set(next,i-2,t);
                tryy(next);
            }
        }
    }
 
 
 
cout << "kolvo lunok = "<<n<<endl;
 
 
}

http://www.cyberforum.ru/cpp-beginners/thread1474477.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2016, 23:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Поменять местами черные и белые шарики (шашки) (C++):

Поменять местами столбец L и строку K местами квадратной матрицы 4х4
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; #define N 4...

В двумерном массиве поменять местами максимальный и минимальный элемент местами
Написать фрагмент программы для решения следующей задачи.В двумерном массиве...

Поменять местами элементы
// Lab5. Задача 1.cpp : Defines the entry point for the console application....

Поменять местами строки
В данной вещественной матрице порядка 6х9 поменять местами строку, содержащую...

Поменять ячейки местами
Необходимо поменять в рандомно заполненном массиве соседние ячейки местами и...

1
RomanFlash
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
25.11.2016, 23:54 #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
#include <queue>//контейнер реализует модель очереди
#include <iostream>
#include <cstring>
#include <string>
 
using namespace std;
 
const int L= 3;// число шаров черных и белых то есть 3-белых и 3-черных
const int S=3;
const int n = L+S+1; // Подсчет лунок ,лунки занятые шарами+лунка пустая
const char s[3] = {'_', 'S', 'L'};// обазначение шаров и пустой лунки
 
int empty = 0, black = 1, white = 2;
const int raz = 1 << (n*2);//
int d[raz];
int from[raz];
queue<int> q;
int curss = 0, start = 0, finish = 0;
 
void set(int &curss, int pos, int val)
{
pos <<= 1;
curss &= ~((1 << pos)|(1 << (pos+1)));
curss |= val << pos;
}
 
int get(int curss, int pos)
{
pos <<= 1;
return (curss >> pos) & 3;
}
 
void print(int curss)//
{
for(int i = 0; i < n; i++)
{
cout << s[curss&3];
curss >>= 2;
}
}
 
void tryy(int next)
{
if(d[next] == -1)
{
q.push(next);
d[next] = d[curss]+1;
from[next] = curss;
}
}
 
int main()
 
{
 
cout << "kolvo lunok = "<<n<<endl;
 
cout << "L- chernyi shar, S-belyi shar, _ - pustay lunka,"<<endl; //ВЫВОД ПОЯСНЕНИЙ НА ЭКРАН
cout << "kolvo L = "<<L<<endl;//вывод на экран кол-во черных шаров
cout << "kolvo S = "<<S<<endl;//вывод на экра нкол-во белых шаров
for(int i = 0; i < S; i++)
{
set(start,i,black);
set(finish,i,white);
}
//set(start,n,empty);
//set(finish,n,empty);
for(int i = S+1; i < n; i++)
{
set(start,i,white);
set(finish,i,black);
}
 
memset(d,-1,sizeof(d));
 
d[start] = 0;
from[start] = -1;
q.push(start);
 
 
while(true)
{
curss = q.front();
q.pop();
if(curss == finish)
{
while(curss != -1)
{
print(curss);
cout << endl;
curss = from[curss];
}
break;
}
for(int i = 0; i < n-1; i++)
{
int t = get(curss,i);
if(t != empty && get(curss,i+1) == empty)
{
int next = curss;
set(next,i,empty);
set(next,i+1,t);
tryy(next);
}
}
 
for(int i = 1; i < n; i++)
{
int t = get(curss,i);
if(t != empty && get(curss,i-1) == empty)
{
int next = curss;
set(next,i,empty);
set(next,i-1,t);
tryy(next);
}
}
 
for(int i = 0; i < n-2; i++)
{
int t = get(curss,i);
if(t != empty && get(curss,i+1) != empty && get(curss,i+2) == empty)
{
int next = curss;
set(next,i,empty);
set(next,i+2,t);
tryy(next);
}
}
 
for(int i = 2; i < n; i++)
{
int t = get(curss,i);
if(t != empty && get(curss,i-1) != empty && get(curss,i-2) == empty)
{
int next = curss;
set(next,i,empty);
set(next,i-2,t);
tryy(next);
}
}
}
 
 
 
cout << "kolvo lunok = "<<n<<endl;
 
 
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2016, 23:54
Привет! Вот еще темы с решениями:

Поменять местами строки
У меня присутствует код в котором столбец с минимальным в строке &quot;k&quot;...

Поменять строки местами
Меня интересует такой вопрос, вот это неправильный отрывок кода. ... while...

Поменять местами переменные
Здравствуйте! При решении задач, возник вопрос в правильности решения (код...

Поменять местами байты
Есть два байта 0x1f и 0xf0 - ну или другие два случайные. Они стоят в...


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

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

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