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

Путешествие коня. Почему конь не хочет пробежать все возможные варианты? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Rusl_v
 Аватар для Rusl_v
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
15.03.2012, 21:34     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    
    const int size=8;
    
    int horizontal[size]={2,1,-1,-2,-2,-1,1,2};//Ходы коня
    int vertical[size]={-1,-2,-2,-1,1,2,2,1};
    
    int board [size][size]={0};//Массив доски
    
    int recmove=1;//Запись хода
    int x=1,y=1;//Координаты коня
    int verticalx,horizontaly;//Временные координаты коня
    
    for(int i=1;i<=64;i++){
 
    int moveNumber=0;           //Обнуляем ходы
        while(moveNumber<size){
        
            verticalx=x;
            horizontaly=y;
 
            verticalx+=vertical[moveNumber];    //Ходим конём
            horizontaly+=horizontal[moveNumber];
 
            if (verticalx<0||verticalx>7)   //Проверка на выход из массива
                moveNumber++;   //Следующий возможный ход
            else if (horizontaly<0||horizontaly>7)
                moveNumber++;
            else if (board[verticalx][horizontaly]==1)
                moveNumber++;
            else {      //Ход сделан
                board[verticalx][horizontaly]=recmove;
                recmove++;
                x=verticalx;
                y=horizontaly;
                moveNumber=8;//Причина наверное здесь !!!!!!!
            }
        }
    }
 
    cout<<"Ходы коня!"<<endl<<endl;
    for(int z=1,rec=1;z<=64;z++){   //Печатает номер хода и координаты
        for(int j=0;j<size;j++){
            for(int i=0;i<size;i++) 
                if (board[j][i]==rec){
                    cout<<rec<<" Ход "<<j<<"/"<<i<<endl;
                    rec++;
                }
        }
    }
    system("pause");
    return 0;
}
Почему конь не хочет пробежать все возможные варианты?
В чём проблема?
Когда убираю строку moveNumber=8; (с помощью неё мы выходим из цикла while(когда конь походил) и обнуляем наши ходы,вроде всё логично)
Цикл for включен на максимальное кол-во ходов(но без стратегии он конечно столько не пробежит).

Максимальный пробег коня 16 ходов если убрать moveNumber=8;(при том что у коня есть варианты бегать),а если не убирать moveNumber=8 то 4 хода пробег и конь умирает((
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
16.03.2012, 08:04     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #2
Для начала неплохо вообще задачу озвучить
А то мы как бы не в курсе что сделать надо ...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.03.2012, 08: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
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
#include <iostream>
#include <iomanip>
 
// массив всех возможных ходов фигуры (буквой Г)
const int move_types = 8;
int possible_moves[move_types][2]  = {
    {-1, -2}, {-2, -1}, {-2,  1}, { 1, -2},
    {-1,  2}, { 2, -1}, { 1,  2}, { 2,  1} 
};
 
int **desc_state;   // указатель на поле (доску)
int size_x, size_y; // размеры доски
int cur_x, cur_y;   // текущая позиция
 
int max_moves;      // максимальное количество ходов
unsigned int back_ret;
 
// определить возможно ли поставить фигуру на позицию x,y
bool position_possible(int x, int y)
{
    return x >= 0 && y >= 0 && x < size_x && y < size_y;
}
 
// определить возможно ли сделать ход на позицию x,y
// возможно если фигуру можно поставить на клетку x,y 
// и эта клетка не была пройдена ранее
bool move_possible(int x, int y) 
{
    return position_possible(x,y) && desc_state[x][y] == 0;
}
 
// рекурсивная функция поиска пути
bool find_path(int cur_x, int cur_y, int move_num)
{
    // занять клетку cur_x, cur_y
    // записать в нее номер хода
    desc_state[cur_x][cur_y] = move_num;
    
    // если номер текущего хода больше числа максимальных ходов 
    // то обход доски завершен
    if(move_num > max_moves)
        return true;
 
    // цикл проверки всех возможных ходов
    for(int i = 0; i < move_types; ++i)
    {
        int next_x = cur_x + possible_moves[i][0];
        int next_y = cur_y + possible_moves[i][1];
 
        // если возможен такой ход и следующий ход 
        // то вернуть true
        if(move_possible(next_x, next_y) && find_path(next_x, next_y, move_num + 1))
            return true;
    }
 
    // этот участок кода отработает если такой ход невозможен
    // обнулить клетку и уменьшить число ходов на единицу
    desc_state[cur_x][cur_y] = 0;
    ++back_ret;
    --move_num;
 
    return false;
}
 
// начальная инициализация
void init(int **desc, int nrows, int ncols, int start_x, int start_y)
{
    desc_state = desc;  // указатель на двумерный массив - доска
    size_x = nrows;     // размеры доски
    size_y = ncols;
 
    // обнуление доски
    for(int i = 0; i < size_x; ++i) {
        for(int j = 0; j < size_y; ++j)
            desc_state[i][j] = 0;
    }
 
    back_ret = 0;
 
    // количество ходов 
    max_moves = size_x * size_y - 1;
}
 
// это просто вывод доски
void output_path()
{
    for(int i = 0; i < size_x; ++i) {
        for(int j = 0; j < size_y; ++j)
            std::cout << std::setfill('0') << std::setw(2) << desc_state[i][j] << ' ';
 
        std::cout << std::endl;
    }
}
 
int main() 
{
    int nrows = 0;
    int ncols = 0;
 
    int **desc = NULL;
    int sx = 0;
    int sy = 0;
 
    std::cout << "input vertical size: ";
    std::cin  >> nrows;
 
    std::cout << "input horizontal size : ";
    std::cin  >> ncols;
 
    std::cout << "input start X-position: ";
    std::cin  >> sx;
 
    std::cout << "input start Y-position: ";
    std::cin  >> sy;
 
    if(sx >= nrows || sy >= ncols) {
        std::cout << "start positions invalid" << std::endl;
        return -1;
    }
 
    // выделить память под двумерный массив (доску)
    desc = new int *[nrows];
    for(int i = 0; i < nrows; ++i) 
        desc[i] = new int[ncols];
 
    // инициализация
    init(desc, nrows, ncols, sx, sy);
 
    // если функция find_path вернет true
    // то обход существует
    // иначе не существует
    if(find_path(sx, sy, 1))
        output_path();
    else
        std::cout << "path not found" << std::endl;
 
//  std::cout << "\nback ret: " << back_ret;
//  std::cout << "\nmove num: " << move_num;
//  std::cout << std::endl;
 
    // освободить память
    for(int i = 0; i < nrows; ++i)
        delete[] desc[i];
    delete[] desc;
 
    return 0;
}
Как минимум здесь тоже перебирается все возможное количество ходов.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2012, 08:19     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #4
А задача вообще какая? Из всего множества клеток доски, взятых за исходные, определить, сколькими несамопересекающимися вариантами пройти во все конечные? Или сколько существует петель? Лошадь ведь можно так походить, что год потом будешь гадать, чего при этом хотел.
Rusl_v
 Аватар для Rusl_v
13 / 12 / 1
Регистрация: 22.12.2010
Сообщений: 67
17.03.2012, 01:19  [ТС]     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #5
Сори за то что не написал задание
Разработать нужно программу передвижение коня по доске
C++
1
2
int horizontal[size]={2,1,-1,-2,-2,-1,1,2};//Ходы коня
        int vertical[size]={-1,-2,-2,-1,1,2,2,1};
Это все возможные ходы коня
Включить счётчик который изменяется от 1 до 64.Записывайте последний номер каждой клетки,на которую передвинулся конь .Для контроля каждого возможного хода нужно видеть,был ли уже конь на этой клетке.И проверять каждый возможный ход чтобы конь не вышел за край доски.Напишите программу передвижения коня.
Вот как бы задача,конь у меня ходит,только я не пойму почему делает мало ходов,все 8 вариантов перебираются же....
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2012, 10:49     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #6
Rusl_v, смотрите мою программу в посте номер 3, она ищет самый кратчайший способ обхода конем всех клеток доски. Думаю, это то, что Вам надо.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
02.04.2012, 23:05     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #7
fasked, не отрабатывает. Попробуй на доске 8х8, x = 7, y = 7. Ждал пока закончится минут 50, потом просто оборвал. Сел за реализацию, но порывшись в сети тырнэта нашел уже "изобретённый велик", который тут и представляю.
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
const int hor = 8, ver = 8;
 
void print_board( int array[][ver] ) {
    
    cout << endl;
    
    for(int j = 0; j < ver; j++) {
        for(int i = 0; i < hor; i++)
            cout << setw(4) << array[i][j];
        cout << endl << endl;
    }
}
 
int main() {
    
    int board[ hor ][ ver ] = { 0 };
    int horizont[ hor ] = { 2, 1, -1, -2, -2, -1, 1, 2};
    int vertical[ ver ] =   { -1, -2, -2, -1, 1, 2, 2, 1};
    
    int access[ hor ][ ver ] = {
        { 2, 3, 4, 4, 4, 4, 3, 2},
        { 3, 4, 6, 6, 6, 6, 4, 3},
        { 4 ,6 ,8 ,8 ,8, 8, 6, 4},
        { 4 ,6 ,8 ,8 ,8, 8, 6, 4},
        { 4 ,6 ,8 ,8 ,8, 8, 6, 4},
        { 4 ,6 ,8 ,8 ,8, 8, 6, 4},
        { 3, 4, 6, 6, 6, 6, 4, 3},
        { 2, 3, 4, 4, 4, 4, 3, 2},
    };
    
    int current_row, current_col;
    int mov_num;
    int count = 0;                                 
 
    cout << "Enter a horizontal coordinate(0 - 7): ";
    cin >> current_row;
    cout << "Enter a vertical coordinate(0 - 7): ";
    cin >> current_col;
 
    int main_row = current_row, main_col = current_col;
    int row, col;
 
    for( int i = 0; i < 64; ++i ) {
        board[ main_row ][ main_col ] = ++count;
        
        int min_access = 8;
        int minA = 8, minB = 8; 
 
        for( mov_num = 0; mov_num <= 7; ++mov_num ) {
            
            current_row = main_row;
            current_col = main_col;
            
            current_row += horizont[ mov_num ]; 
            current_col += vertical[ mov_num ];
            
            if( current_row >= 0 && current_row <= 7 && current_col >= 0 && current_col <= 7 ) {
                
                --access[ current_row ][ current_col ];
                
                if( min_access > access[ current_row ][ current_col ] && board[ current_row ][ current_col ] == 0) {
                    
                    min_access = access[ current_row ][ current_col ];
                    
                    if( board[ current_row ][ current_col ] == 0 ) {
                        row = current_row;
                        col = current_col;
                    }
                    
                    int RowA = current_row, ColumnA = current_col;
                    
                    for( int moveA = 0; moveA <= 7; ++moveA ) {
                        
                        RowA += horizont[ moveA ];
                        ColumnA += vertical[ moveA ];
                        
                        if( RowA >= 0 && RowA <= 7 && ColumnA >= 0 && ColumnA <= 7 ) {
                            if( minA >= access[ RowA ][ ColumnA ] && board[ RowA ][ ColumnA ] == 0 )
                                minA = access[ RowA ][ ColumnA ];
                        }
                    }
                }
                if( min_access == access[ current_row ][ current_col ] && board[ current_row ][ current_col ] == 0) {
                    
                    min_access = access[ current_row ][ current_col ];
                    
                    int RowB = current_row, ColumnB = current_col;
                    
                    for( int moveB = 0; moveB <= 7; ++moveB ) {
                        
                        RowB += horizont[ moveB ];
                        ColumnB += vertical[ moveB ];
                        
                        if( RowB >= 0 && RowB <= 7 && ColumnB >= 0 && ColumnB <= 7 ) {
                            if(minB >= access[ RowB ][ ColumnB ] && board[ RowB ][ ColumnB ] == 0)
                                minB = access[ RowB ][ ColumnB ];
                        }
                    }
                    
                    if( board[ current_row ][ current_col ] == 0 && minB < minA ) {
                        row = current_row;
                        col = current_col;
                    }
                }
            }
        }
 
        main_row = row;
        main_col = col;
    }
 
    print_board( board );
    print_board( access );
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2012, 02:44     Путешествие коня. Почему конь не хочет пробежать все возможные варианты?
Еще ссылки по теме:

C++ Вывести все возможные варианты разреза трубы
Вывести все возможные поля, на которые может попасть шахматный конь за один прыжок из данной клетки C++
C++ Задача - Путешествие коня

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.04.2012, 02:44     Путешествие коня. Почему конь не хочет пробежать все возможные варианты? #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
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
#include <iostream>
#include <iomanip>
 
std::size_t digitsInNumber( int number ) {
    int digits = 1;
 
    while ( number /= 10 )
        digits++;
 
    return digits;
}
 
void arrayOutput( const int* const *const array, const int size ) {
    std::size_t w = digitsInNumber( size * size );
 
    for ( int i = 0; i < size; i++ ) {
        for ( int j = 0; j < size; j++ )
            std::cout << std::setw( w ) << array[ i ][ j ] << ' ';
 
        std::cout << std::endl;
    }
}
 
void resetBoard( int **b, const int size ) {
    for ( int i = 0; i < size; i++ )
        for ( int j = 0; j < size; j++ )
            b[ i ][ j ] = 0;
}
 
void resetAccessibility( int **a, const int boardSize, const int vertical[], const int horizontal[], const int movesSize ) {
    resetBoard( a, boardSize );
 
    for ( int i = 0; i < boardSize; i++ ) {
        for ( int j = 0; j < boardSize; j++ )
            for ( int k = 0; k < movesSize; k++ )
                if ( i + vertical[ k ] >= 0 && i + vertical[ k ] < boardSize && j + horizontal[ k ] >= 0 && j + horizontal[ k ] < boardSize )
                    a[ i + vertical[ k ]][ j + horizontal[ k ]]++;
    }
}
 
int **initMatrix( const int size ) {
    int** tmpArr = new int*[ size ];
 
    for ( int i = 0; i < size; i++ ) {
        tmpArr[ i ] = new int[ size ];
 
        for ( int j = 0; j < size; j++ )
            tmpArr[ i ][ j ] = 0;
    }
 
    return tmpArr;
}
 
bool moveIsPosible( const int posX, const int posY, int **board, const int size ) {
    return ( posX >= 0 && posX < size && posY >= 0 && posY < size && board[ posX ][ posY ] == 0 );
}
 
int main() {
    const int sizeOfBoard = 8,
              sizeOfMoves = 8;
 
    const int vertical[ sizeOfMoves ] = { -1, -2, -2, -1, 1, 2, 2, 1 },
              horizontal[ sizeOfMoves ] = { 2, 1, -1, -2, -2, -1, 1, 2 };
 
    int **board = initMatrix( sizeOfBoard ),
        **accessibility = initMatrix( sizeOfBoard );
 
    int currentRow = 0,
        currentColumn = 0,
        moveNumber = 0,
        move = 0,
        completeJourneys = 0;
 
    for ( int row = 0; row < sizeOfBoard; row++ ) {
        for ( int col = 0; col < sizeOfBoard; col++ ) {
            resetBoard( board, sizeOfBoard );
            resetAccessibility( accessibility, sizeOfBoard, vertical, horizontal, sizeOfMoves );
 
            currentRow = row;
            currentColumn = col;
            board[ currentRow ][ currentColumn ] = move = 1;
 
            do {
                for ( int k = 0; k < sizeOfMoves; k++ ) {
                    if ( currentRow + vertical[ k ] >= 0 && currentRow + vertical[ k ] < sizeOfBoard && currentColumn + horizontal[ k ] >= 0 && currentColumn + horizontal[ k ] < sizeOfBoard )
                        accessibility[ currentRow + vertical[ k ]][ currentColumn + horizontal[ k ]]--;
                }
 
                moveNumber = -1;
 
                for ( int k = 0; k < sizeOfMoves; k++ ) {
                    if ( moveIsPosible( currentRow + vertical[ k ], currentColumn + horizontal[ k ], board, sizeOfBoard )) {
                        if ( moveNumber == -1 )
                            moveNumber = k;
                        else if ( accessibility[ currentRow + vertical[ k ]][ currentColumn + horizontal[ k ]] < accessibility[ currentRow + vertical[ moveNumber ]][ currentColumn + horizontal[ moveNumber ]])
                            moveNumber = k;
                        else if ( accessibility[ currentRow + vertical[ k ]][ currentColumn + horizontal[ k ]] == accessibility[ currentRow + vertical[ moveNumber ]][ currentColumn + horizontal[ moveNumber ]]) {
                            int tmpMoveNumber1 = -1,
                                tmpRowPos1 = currentRow + vertical[ moveNumber ],
                                tmpColPos1 = currentColumn + horizontal[ moveNumber ],
                                tmpMoveNumber2 = -1,
                                tmpRowPos2 = currentRow + vertical[ k ],
                                tmpColPos2 = currentColumn + horizontal[ k ];
 
                            for ( int n = 0; n < sizeOfMoves; n++ ) {
                                if ( moveIsPosible( tmpRowPos1 + vertical[ n ], tmpColPos1 + horizontal[ n ], board, sizeOfBoard )) {
                                    if ( tmpMoveNumber1 == -1 )
                                        tmpMoveNumber1 = n;
                                    else if ( accessibility[ tmpRowPos1 + vertical[ n ]][ tmpColPos1 + horizontal[ n ]] < accessibility[ tmpRowPos1 + vertical[ tmpMoveNumber1 ]][ tmpColPos1 + horizontal[ tmpMoveNumber1 ]])
                                        tmpMoveNumber1 = n;
                                }
 
                                if ( moveIsPosible( tmpRowPos2 + vertical[ n ], tmpColPos2 + horizontal[ n ], board, sizeOfBoard )) {
                                    if ( tmpMoveNumber2 == -1 )
                                        tmpMoveNumber2 = n;
                                    else if ( accessibility[ tmpRowPos2 + vertical[ n ]][ tmpColPos2 + horizontal[ n ]] < accessibility[ tmpRowPos2 + vertical[ tmpMoveNumber2 ]][ tmpColPos2 + horizontal[ tmpMoveNumber2 ]])
                                        tmpMoveNumber2 = n;
                                }
                            }
 
                            if (( tmpMoveNumber1 == -1 && tmpMoveNumber2 != -1 )
                                || (( tmpMoveNumber1 != -1 && tmpMoveNumber2 != -1 )
                                     && ( accessibility[ tmpRowPos2 + vertical[ tmpMoveNumber2 ]][ tmpColPos2 + horizontal[ tmpMoveNumber2 ]] < accessibility[ tmpRowPos1 + vertical[ tmpMoveNumber1 ]][ tmpColPos1 + horizontal[ tmpMoveNumber1 ]])))
                                moveNumber = k;
                        }
                    }
                }
 
                if ( moveNumber != -1 ) {
                    currentRow += vertical[ moveNumber ];
                    currentColumn += horizontal[ moveNumber ];
                    board[ currentRow ][ currentColumn ] = ++move;
                }
 
            } while ( moveNumber != -1 );
 
            if ( move == sizeOfBoard * sizeOfBoard )
                completeJourneys++;
        }
    }
 
    for ( int i = 0; i < sizeOfBoard; i++ ) {
        delete [] board[ i ];
        delete [] accessibility[ i ];
    }
 
    delete [] board;
    delete [] accessibility;
 
    std::cout << "Size of board: " << sizeOfBoard << " * " << sizeOfBoard << "\nComplete journeys: " << completeJourneys << " of " << sizeOfBoard * sizeOfBoard << std::endl;
 
    return 0;
}
Yandex
Объявления
03.04.2012, 02:44     Путешествие коня. Почему конь не хочет пробежать все возможные варианты?
Ответ Создать тему
Опции темы

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