Recursive Magic Square - Передача 2D Array в функцию для модификации - PullRequest
0 голосов
/ 07 ноября 2011

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

Введите размер магического квадрата: 3
8 1 6
3 5 7
4 9 2

#include<stdio.h>

/* Recursive function, square, for allocating values within the magic square */
int square(int row, int col, int m, int nextvalue, int *S[][m]){
int nextval = nextvalue;
int n = m;

if (nextvalue == 1){ //for first number placement
    S[row][col] = 1;
    square(row - 1, col + 1, m, nextvalue + 1, S[m][m]);
    //return (square(row - 1, col + 1, m, nextvalue + 1, S[m][m]));
}
if (nextval = m){ //when nextvalue = n, end recursive function call
    return 1;
}
if (row < 0){ //to check and see if the next row'th location is within range of n
    row = m - 1;
}
if (col > (m - 1)){ //to check and see if the next col'th location is within range of n
    col = 0;
}
else {
    //check to see if the next spot is available
    if (S[row][col] = 0){
        S[row][col] = nextval;
        square(row - 1, col + 1, m, nextvalue + 1, S[m][m]);
        //return (square(row - 1, col + 1, m, nextval + 1, S[m][m]));
    }
    else if (S[row][col] != 0){
        if (col == 0){
            col = m - 1;
        }
        else if (col > 0){
            col = col - 1;
        }
        if (row >= (m-2) || row == (m-1)){
            row = (row + 2) - m;
        }
        else if (row < m-2){
            row = row + 2;
        }
        S[row][col] = nextval;
        square(row - 1, col + 1, m, nextvalue + 1, S[m][m]);
        //return (square(row - 1, col + 1, m, nextval + 1, S[m][m]));
    }
}
}

int main (){
int n = -1, middle = 0, i, j;

while (n == -1 || (n % 2 != 0)){
printf("Please enter and odd number, n, the size of the magic square:\n");
scanf("%d", &n);
}

/* Declaring the 2 Dimension Array, S, of size n x n */
int S[n][n] = 0;

middle = (n / 2) + 1;
square(1, middle, n, 1, S[n][n]);

/* Nested for loops for printing the magic square */
for (i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        printf("%d\t", S[i][j]);
    }
    printf("\n");
}

return 0;
}

С помощью приведенного выше кода я пытаюсь рекурсивно передать строку, столбец, размер массива (n) и массив S в квадрат функции, чтобы рекурсивно добавить значения в массив.Тем не менее, я продолжаю получать следующие ошибки:

p2.c: In function 'square':
p2.c:9: warning: assignment makes pointer from integer without a cast
p2.c:10: warning: passing argument 5 of 'square' from incompatible pointer type
p2.c:25: warning: assignment makes pointer from integer without a cast
p2.c:26: warning: passing argument 5 of 'square' from incompatible pointer type
p2.c:42: warning: assignment makes pointer from integer without a cast
p2.c:43: warning: passing argument 5 of 'square' from incompatible pointer type
p2.c: In function 'main':
p2.c:58: error: variable-sized object may not be initialized
p2.c:61: warning: passing argument 5 of 'square' makes pointer from integer without a cast

1 Ответ

0 голосов
/ 07 ноября 2011

S[m][m] - это значение одного элемента в массиве, то есть целое число, а не массив размером m * m.

...