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

найти ошибку в задаче шахматы - C++

Восстановить пароль Регистрация
 
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
11.09.2011, 13:37     найти ошибку в задаче шахматы #1
здравствуйте! не могу найти ошибку в своем решений. у кого какие идеи? условие задачи:

Азиз и Иван решили поиграть в шахматы. Однако у них не нашлось целой шахматной доски, поэтому Иван склеил ее из нескольких кусков. Каждый кусок вырезан из правильной шахматной доски. Однако Азиз считает что на полученной доске просто невозможно играть в шахматы. Поэтому вместо игры в шахматы они решили выяснить — а из какого минимального количества кусков шахматной доски Иван мог склеить эту доску. Помогите им!

Формат входных данных:
Стандартный поток ввода содержит восемь строк, состоящие из восьми символов «W» и «B», не разделенных пробелами. Символ «W» обозначает белую клетку, а символ «B» — черную.
Формат выходных данных:
Стандартный поток вывода должен содержать одно число — минимальное количество кусков, из которых могла быть склеена заданная доска.

пример:
вход:
WBWBWBBW
BWBBWBWB
WBWWBWBW
WBWWBWWB
BWBBWBWB
WBWBWWBW
BWBWBBWB
WBWBWWBW

выход: 4

мой код:

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 <cmath>
using namespace std;
int main()
{
    char mas[8][8];
    int count1=0;
    int count2=0;
    int yaya;
 
    for (int i=0; i<8; i++)
    {
        for (int j=0; j<8; j++)
        {
            cin >> mas[i][j];
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[0][i1]==mas[0][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[1][i1]==mas[1][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[2][i1]==mas[2][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[3][i1]==mas[3][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[4][i1]==mas[4][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[5][i1]==mas[5][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[6][i1]==mas[6][j2+1])
        {
            count1++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[7][i1]==mas[7][j2+1])
        {
            count1++;
        }
    }
 
    //
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][0]==mas[j2+1][0])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][1]==mas[j2+1][1])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][2]==mas[j2+1][2])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][3]==mas[j2+1][3])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][4]==mas[j2+1][4])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][5]==mas[j2+1][5])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][6]==mas[j2+1][6])
        {
            count2++;
        }
    }
 
    for (int i1=0, j2=0; i1<8, j2<7; i1++, j2++)
    {
        if (mas[i1][7]==mas[j2+1][7])
        {
            count2++;
        }
    }
 
    cout << abs(count1- count2);
 
    return 0;
 
}
p/s: не судите за стиль моего программирования, знаю код можно написать куда компактнее и красивее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 13:37     найти ошибку в задаче шахматы
Посмотрите здесь:

C++ Найдите ошибку в задаче: "дана матрица, если выполняется условие, то следует исполнить преобразование.."
Немогу найти ошибку в задаче( C++
Ошибка в задаче: Найти мин. k, которое будет удовлетворять условию: fabs(правая часть - левая часть) < 10^(-15) C++
C++ я решил задачу про шахматы посмотрите ошибку
Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
11.09.2011, 13:47  [ТС]     найти ошибку в задаче шахматы #2
это пример входного и выходного примера в графическом виде
найти ошибку в задаче шахматы
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.09.2011, 14:24     найти ошибку в задаче шахматы #3
jambas92, ссылку на задачу можете дать?

Добавлено через 20 минут
Предварительно могу сказать только:
тест:
WWWWWWWW
WWWWWWWW
WWWWWWWW
WWWWWWWW
WWWWWWWW
WWWWWWWW
WWWWWWWW
WWWWWWWW

Ваш код дает ответ - 0.
По моему должно быть - 64.
И я эту задачу совсем бы по другому решал.
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
11.09.2011, 14:46  [ТС]     найти ошибку в задаче шахматы #4
valeriikozlov, да точно. поделитесь алгоритмом????

Добавлено через 1 минуту
acm.iitu.kz
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.09.2011, 15:21     найти ошибку в задаче шахматы #5
jambas92, так я и не смог добраться до сдачи задачи. Поэтому проверяйте сами:
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
#include <iostream>
#include <cmath>
using namespace std;
int main()
{ 
    char mas[8][8];
        int mas1[8][8];
        int tmp=0, i, j;
 
        for (i=0; i<8; i++)
        {
                for (j=0; j<8; j++)
                {
                        cin >> mas[i][j];
                        mas1[i][j]=0;
                }
        }
        while(true)
        {
            bool fl=true;
            for(i=0; i<8 && fl; i++)
                for(j=0; j<8; j++)
                    if(mas1[i][j]==0)
                    {
                        tmp++;
                        mas1[i][j]=tmp;
                        fl=false;
                        break;
                    }
            if(fl)
                break;
            while(!fl)
            {
                fl=true;
                for(i=0; i<8; i++)
                    for(j=0; j<8; j++)
                        if(mas1[i][j]==tmp)
                        {
                            if(mas[i][j]=='W')
                            {
                                if(i>0 && mas1[i-1][j]==0 && mas[i-1][j]=='B')
                                {
                                    fl=false;
                                    mas1[i-1][j]=tmp;
                                }
                                if(i<7 && mas1[i+1][j]==0 && mas[i+1][j]=='B')
                                {
                                    fl=false;
                                    mas1[i+1][j]=tmp;
                                }
                                if(j>0 &&  mas1[i][j-1]==0 && mas[i][j-1]=='B')
                                {
                                    fl=false;
                                    mas1[i][j-1]=tmp;
                                }
                                if(j<7 &&  mas1[i][j+1]==0 && mas[i][j+1]=='B')
                                {
                                    fl=false;
                                    mas1[i][j+1]=tmp;
                                }
                            }
                            else
                            {
                                if(i>0 && mas1[i-1][j]==0 && mas[i-1][j]=='W')
                                {
                                    fl=false;
                                    mas1[i-1][j]=tmp;
                                }
                                if(i<7 && mas1[i+1][j]==0 && mas[i+1][j]=='W')
                                {
                                    fl=false;
                                    mas1[i+1][j]=tmp;
                                }
                                if(j>0 &&  mas1[i][j-1]==0 && mas[i][j-1]=='W')
                                {
                                    fl=false;
                                    mas1[i][j-1]=tmp;
                                }
                                if(j<7 &&  mas1[i][j+1]==0 && mas[i][j+1]=='W')
                                {
                                    fl=false;
                                    mas1[i][j+1]=tmp;
                                }   
                            }
                        }
            }
        }    
        cout << tmp;
 
        return 0;
 
}
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
11.09.2011, 17:45  [ТС]     найти ошибку в задаче шахматы #6
valeriikozlov, ответ верный, спасибо. не могли бы Вы разъяснить задачу???
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.09.2011, 18:07     найти ошибку в задаче шахматы #7
Цитата Сообщение от jambas92 Посмотреть сообщение
не могли бы Вы разъяснить задачу???
По-моему это называется раскраской графа (но может быть я и ошибаюсь).
В общем так:
1) Сначало массив mas1[8][8] обнуляем.
2) Потом ищем первое значение в mas1[8][8] которое равно 0. (ищем неокрашенную точку). Присваиваем ей значение tmp (которое перед этим увеличили). Если такого значения не нашли, выходим из первого цикла.
3) Затем ищем во втором цикле все точки, которые неокрашенные, но подходящие под кусок текущей шахматной доски (это кусок доски, значения которой в mas1[][] равны tmp) и окрашиваем их тоже (присваиваем значение tmp).
4) Переходим к п. 2

По окончании первого цикла выводим значение tmp - это и есть ответ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 18:54     найти ошибку в задаче шахматы
Еще ссылки по теме:

C++ Шахматы: найти количество путей для попадания в точку n
Калькулятор Z-1. Укажите на ошибку в программе к задаче C++
Помогите найти ошибку в задаче на структуры C++

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

Или воспользуйтесь поиском по форуму:
jambas92
 Аватар для jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
11.09.2011, 18:54  [ТС]     найти ошибку в задаче шахматы #8
valeriikozlov гениально! спасибо большое!!!
Yandex
Объявления
11.09.2011, 18:54     найти ошибку в задаче шахматы
Ответ Создать тему
Опции темы

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