Домино. Неверно выводятся данные.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Сергей12
Сообщения: 1
Зарегистрирован: 20 окт 2015, 20:32

Домино. Имеется произвольная комбинация костей домино, составляющая легальную текущую игровую позицию. Определить, является ли данная комбинация "тупиковой", то есть такой, в которой очередной ход невозможен. Необходимо предусмотреть проверку корректности заданной комбинации.

Код: Выделить всё

#include "math.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <ctime>
#include <iomanip>


int main()
{
    int k, i;
    FILE *ptrfile;
    k = 0;
    int s;
    ptrfile = fopen("D:\\input.txt", "r+"); //так мне было короче )

    while ((fscanf(ptrfile, "%d", &s) != EOF))
    {
        if (!ptrfile) break;    //чтобы не делал лишнего
        k += 1;
    }
    int *c = (int*)malloc(k*sizeof(int));  //должен быть динамическим

    rewind(ptrfile);    //перематываем файл для повторного чтения
    for (i = 0; i < k; i++)
    {
        fscanf(ptrfile, "%d", &c[i]);//размер массива
        printf("c[%d]=%d  ", i, c[i]); //элементы массива

        if (i == 1) {
            int m = 1;



            int *p = (int*)malloc(m*sizeof(int));
            for (m = 0; m < c[0] + 2; m = m + 2) {

                p[m] = c[1] / pow(10, (c[0] - m));// формула разложения сплошного числа на пары
                if (m > 1) {
                    p[m] = p[m] % 100;
                    std::cout << p[m] << " ";//разложенные числа массива на пары 1-й массив p[m]
                }

int y = 1;
int *pt = (int*)malloc(y*sizeof(int));
                    for (y = 0; y < c[0] + 2; y = y + 2) {

                        pt[y] = c[1] / pow(10, (c[0] - y));
                        if (y > 1) {
                            pt[y] = pt[y] % 100;
                            std::cout << pt[y] << " ";//разложенные числа массива на пары 2-й массив P[y]
                        }





                  //проверка на повтор фишек
                           int e = 1;
                            for (m = 0; m < c[0]; m++) {
                                for (y = 0; y < c[0] ; y++) {

                                    if ((((p[m] / 10) == (p[y] / 10))) && (((p[m] / 10) == (p[y] % 10)))&& (m != y)) { std::cout << "#1";e = e + 1; }

                                    if ((((p[m]) / 10) == ((p[y]) % 10)) && (((p[m]) % 10) == ((p[y]) / 10)) && (m != y)) {std::cout << "#2"; e = e + 1; }

                                    if (e != 1) { std::cout << "stop, repeat!" << " "; getchar();return 0;}
                                }
                            }

//составление "змкейки"

{int k=1;
for (m=0;m<c[0];m++){	int z = 0;

while(k!=c[0]){
if (  ( (p[m]%10)==(p[m+k]%10) && (m!=m+k) )    ||  ( (p[m]/10)==(p[m+k]/10) && (m!=m+k) )  ||  ( (p[m]%10)==(p[m+k]/10) && (m!=m+k) ) ||  ( (p[m]/10)==(p[m+k]%10) && (m!=m+k) )  )  {z++;}

k++;
} if (z == c[0]) { std::cout << "Combination is normal."; }k = z;
}if (k!=c[0]){std::cout<<"Deadlock combination !";}



}
}}


                }







                }


    fclose(ptrfile);
    free(c); //убираем мусор, когда уже не нужен (но не раньше =))

    getchar();  //задержка консоли
    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Обещаю посмотреть код, если переработаешь его так, чтобы он был отформатирован отступами и переменным были даны говорящие имена.
При текущем состоянии кода для того, чтобы разобрать алгоритм, придётся удержать в голове предназначение доброго десятка однобуквенных переменных, а это не так-то просто.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Учитесь делать код читабельным. Разбейте задачу на блоки и оформите в виде процедур или функций. Длинных и многоэтажных if быть не должно - аналогично и для for. Если вы ушли дальше 3 уровня вложенности, то такой код сложен для понимания и требуется реструктуризация/рефактор.
Касательно алгоритма: работать с числами "в лоб", да еще и разбивая их на пары на лету - не есть хорошо. Я бы рекомендовал для каждой кости выделить отдельный элемент int[] в качестве счетчика. При чтении кости из файла счетчик увеличивается на 1 и если кол-во конкретной кости больше 1 - то прервать загрузку. Проверку возможности связывания костей сделать в виде функции bool (int, int). Проверка валидности кости в виде функции bool (int). Соответственно "тупиковость" сведется к перебору тех костей, у которых счетчик == 0 и проверке связывания концевых костей. При таком подходе ошибки маловероятны и даже если и возникают - легко обнаруживаются.
Вообще, по хорошему, напрашивается создание класса. А на данный момент ваш код напоминает обфусцированный javascript.
It's a long way to the top if you wanna rock'n'roll
Ответить