как проверить, имеет ли матрица одинаковое значение в строке или столбце в C - PullRequest
0 голосов
/ 25 октября 2019

У меня проблема с домашним заданием. Это требует от нас, чтобы сделать матрицу на основе ввода пользователя. Например: если пользователь введет 4, то матрица будет 4 X 4. После этого программа проверит, имеет ли матрица одинаковое значение в строке или столбце. и это даст да или нет вывод.

Например:

вход:

2
1 2
2 1

Выход:

Yes

(потому что эта матрицане имеет одинаковое значение в строке или столбце.)

Вход 2:

3
4 5 6
7 8 9
7 3 3

Выход:

No 

(поскольку эта матрица имеет одинаковые значения встрока или столбец (3 и 3 и 7 и 7)

Вход 3:

2
1 2
3 2

Выход:

No 

(поскольку эта матрица имеет одинаковое значение настолбец 1.)

Вход 4

2
1 1
3 4

Выход:

No

(поскольку эта матрица имеет то же значение в первой строке (1 1)

Я пытался это сделать, но некоторые «случаи» все еще не работают. Например, я пытался включить счетчик в мой код, но некоторые из них неверны.

пример: input:

4
3 4 5 6
2 3 4 5
6 5 6 3
5 4 6 3

ВЫХОД:

No
count : 2

(должно быть 3, потому что оно имеет то же значение, что и 6 (в строке 3), 6 в столбце 3 и 3 в столбце 4.)

#include "stdio.h"

int main()
{

    int matrix[500][500];
    int testcase;
    int count = 0;
    scanf("%d",&testcase); getchar();

    for(unsigned i = 0; i < testcase; i++) {
        for(unsigned j = 0; j < testcase; j++) {
            scanf("%d",&matrix[i][j]); getchar();
        }
    }
    // printf("[0,0] = %c",matrix[0][0]);
    // printf("\n[0,1] = %c",matrix[0][1]);
    // printf("\n[1,0] = %c",matrix[1][0]);
    // printf("\n[1,1] = %c",matrix[1][1]);

    for(unsigned i = 0; i < testcase; i++) {
        for(unsigned j = 0; j < testcase; j++) {
            if(matrix[i][j] == matrix[i][j+1]) {
                count = count + 1;
            }
            else if(matrix[i][j] == matrix[i+1][j]) {
                count = count + 1;
            }

        }
    }
    if(count > 0) {
        printf("No\n");
    } else{
        printf("Yes\n");
    }

    printf("Count : %d\n",count );
    getchar();
    return 0;
}

1 Ответ

0 голосов
/ 25 октября 2019

Как я вижу, вы проверяете, отличаются ли два числа одного и того же значения только одним столбцом или одной строкой:

if(matrix[i][j] == matrix[i][j+1]) {
      count = count + 1;
}
else if(matrix[i][j] == matrix[i+1][j]) {
      count = count + 1;
}

Я думаю, что вам может понадобиться временная переменная, чтобы вы могли сканировать каждую строку изатем каждый столбец отдельно, например:

temp = matrix[i][j];
if(checkRow(temp, i, j, matrix, testcase) == true) count++;
if(checkColumn(temp, i, j, matrix, testcase) == true) count++;

и checkRow будет выглядеть примерно так:

bool checkRow(int temp, int row, int col, int matrix[][500], int size)
{
   for(int i=col; i < size;)
   {
      if(temp == matrix[row][i]) return true;
   }

    return false;
}

и соответственно вы создадите функцию checkColumn.

РЕДАКТИРОВАТЬ : Поскольку вы сказали мне, что еще не научились использовать функции, это будет ваша последняя программа. Это работает, и я мог бы предложить, чтобы в окончательном тестовом примере было выведено «count = 4», поскольку есть случай, который вы могли бы пропустить. Вот код:

#include "stdio.h"
int main()
{

    int matrix[500][500];
    int testcase;
    int count = 0;
    scanf("%d",&testcase); getchar();
    int temp;
    for(unsigned i = 0; i < testcase; i++) {
        for(unsigned j = 0; j < testcase; j++) {
            scanf("%d",&matrix[i][j]); getchar();
        }
    }
    // printf("[0,0] = %c",matrix[0][0]);
    // printf("\n[0,1] = %c",matrix[0][1]);
    // printf("\n[1,0] = %c",matrix[1][0]);
    // printf("\n[1,1] = %c",matrix[1][1]);

    for(unsigned i = 0; i < testcase; i++) {
        for(unsigned j = 0; j < testcase; j++) {
            temp = matrix[i][j];
            //Scan current row
            for(unsigned k = j+1; k < testcase; k++)
            {
                if(temp == matrix[i][k])
                {
                    count++;
                    break;
                }
            }
            //Scan current column
            for(unsigned k = i+1; k < testcase; k++)
            {
                if(temp == matrix[k][j])
                {
                    count ++;
                    break;
                }
            }
        }
    }
    if(count > 0) {
        printf("No\n");
    } else{
        printf("Yes\n");
    }

    printf("Count : %d\n",count );
    getchar();
    return 0;
}

Могу ли я предложить, прежде чем копировать код, вы должны понять алгоритм, лежащий в его основе. Это простое и грубое мышление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...