проверить решение «Восемь ферзей» с помощью суммы диагональных элементов в двумерном массиве

Я работаю над заданием, касающимся головоломки с восьмеркой ферзей в шахматах. Упражнение выглядит следующим образом:

Учитывая расположение 8 ферзей на шахматной доске, напишите программу на C, которая будет оценивать расположение и информировать пользователя, является ли это расположение решением головоломки.

Теперь, поскольку есть 92 возможных решения, нецелесообразно сравнивать пользовательский ввод со списком решений, поэтому я решаю проблему следующим образом:

Я рассматриваю массив 8x8. Представляя пустое поле с 0 и поле с ферзем с 1, все, что мне нужно проверить, чтобы решение было правильным, это:

Сумма каждой строки, столбца и возможной диагональной линии не должна превышать 1.

И вот моя проблема: я покрыл строки и столбцы, но я не могу найти способ добавить диагонали. В целях разъяснения:

Суммы

Каждая диагональная линия представляет собой квадраты, которые необходимо суммировать каждый раз. Результат каждой строки будет храниться в массиве. Это происходит для обоих направлений.

Код пока:

#include <stdio.h>

int check(int array[8][8])
{
    int i, j;
    int rowsum[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    int colsum[8] = {0, 0, 0, 0, 0, 0, 0, 0};

    for (i = 0; i <= 7; i++) //test if are 2 queens on the same row (i: row, j: column)
    {
        for (j = 0; j <= 7; j++)
        {
            rowsum[i] += array[i][j]; /*since they are represented by 0s and 1s,
                                if a row's sum is bigger than 1
                                there is more than 1 queen on that particular row
                                here the row doesn't change until all
                                columns are accessed (we get a row sum)*/
        }
    }


    for (i = 0; i <= 7; i++) //same as before, but for columns
    {
        for (j = 0; j <= 7; j++)
        {
            colsum[i] += array[j][i]; //here the col. doesn't change until all rows are accessed (we get a col. sum)
        }
    }
}

int main(void)
{
    int i = 1; //counter for the input
    int row = 0;
    int column = 0; //row and column numbers

    int board[8][8] = {
        {0, 0, 0, 0, 0, 0, 0, 0},   //here we initialize an empty board as an 8x8 array
        {0, 0, 0, 0, 0, 0, 0, 0},   //from now on: a 0 is an empty square, a 1 is a queen
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0}
    };

    while (i <= 8) //we fill our board with queens
    {
        printf("Queen #%d row:", i);
        scanf("%d", &row);
        printf("Queen #%d column:", i);
        scanf("%d", &column);
        board[row - 1][column - 1] = 1;
        i++;
    }

    check(board);
}

Любая помощь будет принята с благодарностью.

EDIT: Решено. Большое спасибо @Yunnosch за то, что указал мне правильное направление! К сведению об окончательном решении: вы можете найти его здесь с поясняющими комментариями: Решение

EDIT-2: Вы можете найти весь код здесь, также с комментариями.

@Yunnosch: Это может быть не элегантно или даже неэффективно, но работает хорошо. Быстрый вопрос: был ли этот метод тем, который вы имели в виду, или это нововведение? :П


person lightspot21    schedule 18.12.2017    source источник
comment
Ваша функция check имеет возвращаемый тип int, но она не возвращает никаких значений, и вы все равно не проверяете значение, так зачем ее вызывать?   -  person Chris Turner    schedule 18.12.2017
comment
В упражнении явно требуется, чтобы логика оценки находилась в отдельной функции.   -  person lightspot21    schedule 19.12.2017
comment
Бьюсь об заклад, упражнение также хочет, чтобы отдельная функция фактически возвращала значение для остальной части кода, чтобы проверить тоже   -  person Chris Turner    schedule 19.12.2017
comment
Да, но я еще не написал код для этого. Сначала я решу проблему с массивом, остальные - это цикл for и условие;)   -  person lightspot21    schedule 19.12.2017
comment
Ответ на вопрос, адресованный лично мне (еще комментарий за отсутствие ответа на главный вопрос): Я никогда не имел в виду метод. Я только что помог вам продумать приличный вариант, который вы наметили с самого начала. Я не знаю, было ли это новым изобретением. На догадку (и в надежде не навредить вам) никто не будет беспокоить, потому что это действительно не особенно эффективно. По крайней мере, массивы можно оптимизировать. Но ведь вашей настоящей целью было обучение, не так ли? Я думаю, вы полностью справились с этой задачей. Я проверил кратко и обнаружил, что темы, которые я упомянул, были затронуты. Поздравляем.   -  person Yunnosch    schedule 22.12.2017


Ответы (1)


Поскольку это задание, я придерживаюсь компромисса при решении домашних заданий. т.е. Я не буду предлагать решение. Вместо этого вот первый намек на то, как вы должны подходить к проблеме.

Подсказка1:
В каждом направлении имеется по 15 диагоналей. Их длина от 1 до 8. Все длины существуют дважды, кроме длины 8.

Подсказка 2:
У вас есть массив со счетчиками для столбцов и один массив со счетчиками для строк, оба имеют размер 8, потому что есть 8 строк и 8 столбцов.
Вам не хватает массива со счетчиками для / диагоналей и массив со счетчиками для диагоналей \.
Введите их и заполните их счетчиками, аналогично тому, как вы заполняете массивы строк и столбцов. При подсчете необходимо помнить о различной длине диагоналей.

Дайте мне знать, насколько это поможет.
Я мог бы намекнуть на следующий шаг.

(политика описана здесь: Как мне задать и отвечать на домашние вопросы? )

person Yunnosch    schedule 18.12.2017
comment
Не могли бы вы немного пояснить? Я пытался понять это весь день, и до сих пор нет костей. Спасибо - person lightspot21; 19.12.2017
comment
Я рад отметить, что я, кажется, помог вам. Хотите добавить свой ответ с окончательным кодом, который вы создали? Я бы с удовольствием посмотрел, как все обернулось. Также я уверен, что минусов вы не получите. - person Yunnosch; 21.12.2017
comment
Будьте осторожны, чтобы не публиковать слишком много стены кода. Придерживайтесь рекомендаций Как ответить. - person Yunnosch; 22.12.2017
comment
Это на pastebin. Вы действительно думали, что я буду загромождать экраны людей блоком кода в 200 строк? :П - person lightspot21; 22.12.2017