проверить 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 ответов:
Вы не нарушаете / выходите из цикла проверки, когда извлекается первый не совпадающий символ.
Кроме того, ваш вложенный 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; }