проверить 2d массив по диагонали?


Я пытаюсь искать массив 3x3 2d по диагонали, вот так:Введите описание изображения здесь

Я хочу проверить, все ли квадраты в диагонали имеют одинаковое значение. Вот как я пытаюсь это сделать:

thisOne = board[0][2];    //set to 'X'
    for(i = 0; i<3; i++) {
        for(j = 3; j>0; j--){
            if(board[i][j-1] != thisOne) {
                thisOne= '';
            }
        }
    }
//since all boxes were 'X', thisOne is still set to 'X'
if(thisOne != '') {
    winner = thisOne;
    printf("vinnare på nördöstn");
}

Итак, после запуска этого кода winner должно быть "X", если все поля-X. Но код этого не делает, почему это так?

6 3

6 ответов:

Вам нужно проверять только диагональные ячейки вместо проверки всех ячеек.

Вы не нарушаете / выходите из цикла проверки, когда извлекается первый не совпадающий символ.

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

Вы можете легко простой while

int i=0;
int j=2;
while ((i<3) && (j>=0) && (board[i][j] == thisOne))
{
   i++;
   j--;
}

// if i<3 the diagonal is not full of thisOne char
if ( i < 3)
{
}

Как сказал @BLUEPIXY, проблема заключается в том, что цикл j вложен в цикл i. Таким образом, для каждой итерации в цикле i цикл j выполняется 3 раза на каждом столбце, вместо того, чтобы просто работать на малой диагонали. Существует несколько способов исправить это, хотя наиболее оптимальным было бы использовать только один цикл и только одну переменную i.

for(i=0;i<3;i++) {
    if(board[i][2-i]!=thisOne) {
        thisOne='\0'
        break;
    }
}

Чтобы достичь своей цели, вам просто нужно уменьшить X-итератор и y-итератор при прохождении через Ваш массив.

Вот простой пример:

#include <stdio.h>
#include <stdlib.h>

int     main(void)
{
  int   arr[3][3];
  int   it_y;
  int   it_x;

  it_y = 0;
  it_x = 2;
  arr[0][0] = 0;
  arr[0][1] = 1;
  arr[0][2] = 2;
  arr[1][0] = 3;
  arr[1][1] = 4;
  arr[1][2] = 5;
  arr[2][0] = 6;
  arr[2][1] = 7;
  arr[2][2] = 8;
  while (it_x < 3 && it_x >= 0)
    {
      printf("[%d][%d]: '%d'\n", it_y, it_x, arr[it_y][it_x]);
      --it_x;
      ++it_y;
    }
  return EXIT_SUCCESS;
}

Вы можете сделать как

for(int row=0,col=2; row<3; row++,col--)
{
    if(board[row][col] != thisOne) 
    {
            thisOne= '\0';
    }
}

Вы можете проверить только диагональные элементы, как это

for(i = 0, j = 3-1; i < 3; i++, j--) { 
    if(board[i][j] != thisOne) { 
       thisOne = '\0'; 
    } 
 }