C - Как исправить ошибку возвращаемого типа рекурсивной функции - PullRequest
0 голосов
/ 01 апреля 2019

Я не уверен, почему моя функция solve_sudoku приводит к этой ошибке:

error: void value not ignored as it ought to be

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

Любая помощь приветствуется.

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

void print_sudoku(int sudoku[9][9]){
  printf("The Sudoku contains:\n");
  for (int j=0; j<9; j++)
  {
    for (int i=0; i<9;i++)
    {
      printf("%d  ",sudoku[j][i]);
    }
    printf("\n");
  }
}

int rowExists(int sudoku[9][9], int i, int num){
  for (int j=0;j<9;j++){
    if (sudoku[i][j]==num){
      return 1;
    }
  }
  return 0;
}

int colExists(int sudoku[9][9], int j, int num) {
  for (int i=0;i<9;i++) {
    if (sudoku[i][j]==num){
      return 1;
    }
  }
  return 0;
}

int valExists(int sudoku[9][9], int i, int j, int num) {
  for (int r=0;r<3;r++){
    for (int s=0;s<3;s++){
      if (sudoku[r+i][s+j]==num){
        return 1;
      } 
    }
  }
  return 0;
}

int DNE(int sudoku[9][9], int *i, int *j) {
  for (*i=0; *i<9; (*i)++){
    for (*j=0;*j<9;(*j)++){
      if (sudoku[*i][*j]==0){
        return 1;
      }
    }
  }
  return 0;
}

void solve_sudoku(int sudoku[9][9], int depth){
  int i=0;
  int j=0;

  if (!DNE(sudoku, &i, &j)){
    return;
  }

  for (int k=1;k<=9;k++){
    if (!rowExists(sudoku, i, k) && !colExists(sudoku, j, k) && !valExists(sudoku, i-(i%3), j-(j%3), k)){
      sudoku[i][j]=k;
      if (solve_sudoku(sudoku, depth)){
        return;
      }
      sudoku[i][j]=0;
    }
  }
  return;
}

#ifndef __testing
int main(){
   int Sudoku[9][9]={{5, 3, 0, 0, 7, 0, 0, 0, 0},
             {6, 0, 0, 1, 9, 5, 0, 0, 0},
             {0, 9, 8, 0, 0, 0, 0, 6, 0},
             {8, 0, 0, 0, 6, 0, 0, 0, 3},
             {4, 0, 0, 8, 0, 3, 0, 0, 1},
             {7, 0, 0, 0, 2, 0, 0, 0, 6},
             {0, 6, 0, 0, 0, 0, 2, 8, 0},
             {0, 0, 0, 4, 1, 9, 0, 0, 5},
             {0, 0, 0, 0, 8, 0, 0, 7, 9}};

  printf("Input puzzle is:\n");
  print_sudoku(Sudoku);

  solve_sudoku(Sudoku, 0);

  printf("Solution is:\n");
  print_sudoku(Sudoku);

}
#endif

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Поскольку ваш solve_sudoku возвращает void, проверка состояния if (solve_sudoku(sudoku, depth)) показывает эту ошибку - мы не можем проверить, является ли "void" истинным или ложным. Вы должны позволить ему вернуть int.

2 голосов
/ 01 апреля 2019

Следующая строка внутри функции solve_sudoku предполагает, что функция solve_sudoku будет возвращать логическое значение, но тип возвращаемого значения функции void, что создает ошибку.

if (solve_sudoku(sudoku, depth))

Вы можете изменить сигнатуру функции, как показано ниже, и вернуть true / false в соответствии с условием.

Советы: при передаче многомерного массива не нужно указывать первое измерение. Пример: int sudoku [] [9],

bool solve_sudoku(int sudoku[][9], int depth)
...