2017-11-21 19 views
0

私は、ユーザーがパズルのサイズと解を挿入するCでソドク解をチェックするプログラムを構築しています。 2d配列のみを使用して、ソリューションが有効かどうかをチェックする必要があります。Cでsodukuをチェックすると、なぜ私のコードがうまくいかないのですか?

私のアルゴリズムは、すべての行、列、ボックスを1d arrray(それぞれ)に入れ、ソートして1-nから別の1d配列と比較することです。

理由はわかりませんが、私のプログラムはうまくいかず、助けが必要です。

マイコード:

/*------------------------------------------------------------------------- 
    Include files: 
--------------------------------------------------------------------------*/ 

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


/*========================================================================= 
    Constants and definitions: 
==========================================================================*/ 

/* put your #defines and typedefs here*/ 
void printOpenMessageForSodokoSize(); 
void printOpenMessageForSodokoSolution(); 
void printValidSolution(); 
void printBadSolution(); 
int root(int a); 
void bubbleSort(int arr[], int n); 
int compareTo(int arr[], int n); 
int checkRows(int n, int mat[][n]); 
int checkColumns(int n, int mat[][n]); 
int checkGrids(int n, int mat[][n], int sRow, int sCol); 

/*------------------------------------------------------------------------- 
    The main program. (describe what your program does here) 
-------------------------------------------------------------------------*/ 
int main() 
{ 
    printOpenMessageForSodokoSize(); 
    int n; 
    int grids=1, rows=1, cols=1; 
    scanf("%d", &n); 
    while(root(n)<=0) 
     scanf("%d", &n); 
    printOpenMessageForSodokoSolution(); 
    int mat[n][n]; 
    for (int i=0;i<n;i++) 
     for (int j=0;j<n;j++) 
      scanf("%d", &mat[i][j]); 
    while(grids) //checking each sub-grid 
    { 
     for (int i=0;i<n;i+=root(n)) 
      for (int j=0;j<n;j+=root(n)) 
       grids=checkGrids(n, mat ,i, j); 
    } 
    rows=checkRows(n, mat); 
    cols=checkColumns(n, mat); 
    if ((rows==1)&&(cols==1)&&(grids==1)) 
     printValidSolution(); 
    else 
     printBadSolution(); 
    return 0; 
} 
void printOpenMessageForSodokoSize() 
{ 
    printf("Please enter the size of your soduko:\n"); 
} 
void printOpenMessageForSodokoSolution() 
{ 
    printf("Please enter your solution:\n"); 
} 
void printValidSolution() 
{ 
    printf("Valid solution!"); 
} 
void printBadSolution() 
{ 
    printf("Bad solution!"); 
} 
int root(int a) //not using math library on purpose. 
{ 
    if (a==0) 
     return 0; 
    if (a<0) 
     return -1; 
    for(int i=1;i<=a;i++) 
    { 
     if (i*i==a) 
      return i; 
    } 
    return -1; 
} 
void bubbleSort(int arr[],int n) //sorting an array 
{ 
    int swap; 
    for (int i=0;i<(n-1);i++) 
     for (int j=0;j<n-i-1;j++) 
     { 
      if (arr[j] > arr[j+1]) 
      { 
       swap=arr[j]; 
       arr[j]=arr[j+1]; 
       arr[j+1]=swap; 
      } 
     } 
} 
int compareTo(int arr[],int n) //check if 2 arrays are equal 
{ 
    int equal=1; //return 1 if equals 0 if not 
    int arr2[n]; //building the array to compare to 
    for(int i=0;i<n;i++) 
     arr2[i]=i+1; 
    while(equal) 
    { 
     for(int i=0;i<n;i++) 
      equal=(arr[i]==arr2[i]); 
    } 
    return equal; 
} 
int checkRows(int n, int mat[][n]) //checking the rows 
{ 
    int rows=1; 
    int arr[n]; 
    while (rows) 
    { 
     for (int i=0;i<n;i++) 
     { 
      for (int j=0;j<n;j++) 
       arr[j]=mat[i][j]; //creating an array for each row 
     bubbleSort(arr, n); // sort it 
     rows=compareTo(arr, n); // compare it 
     } 
    } 
    return rows; 
} 
int checkColumns(int n, int mat[][n]) 
{ 
    int columns=1; 
    int arr[n]; 
    while (columns) 
    { 
     for (int i=0;i<n;i++) 
     { 
      for (int j=0;j<n;j++) 
       arr[j]=mat[j][i]; //creating an array for each column 
     bubbleSort(arr, n); // sort it 
     columns=compareTo(arr, n); //compare it 
     } 
    } 
    return columns; 
} 
int checkGrids(int n, int mat[][n], int sRow, int sCol) 
{ 
    int grids=1; 
    int arr[n]; 
    int index=0; 
    for (int i=sRow;i<root(n);i++) 
     for (int j=sCol;j<root(n);j++) 
     { 
      arr[index]=mat[i][j]; //creating an array for each grid 
      index++; 
     } 
    bubbleSort(arr, n); // sort it 
    grids=compareTo(arr, n); //compare it 
    return grids; 
} 
+0

どうしたのですか?クラッシュしますか?間違った出力を生成しますか?何が起こるのですか? – MrHug

+0

私は有効な4 * 4ソリューションを入力しようとしましたが、プログラムは何かを間違って印刷しません。 – Ro168

+2

これを読んでください:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ –

答えて

1

printf\nが印刷されたりfflush(stdout)が実行されるまで、何でもおprintfが端末に表示されないことを意味し、バッファリングされた出力を使用しています。

次のことを試してみてください。arr[n - 1] == arr2[n - 1]場合が配列を変更whileループでは何もありませんので、forループは常にますので

void printValidSolution() 
{ 
    printf("Valid solution!\n"); // new line added 
} 
void printBadSolution() 
{ 
    printf("Bad solution!\n"); // new line added 
} 

別の問題

int compareTo(int arr[],int n) //check if 2 arrays are equal 
{ 
    int equal=1; //return 1 if equals 0 if not 
    int arr2[n]; //building the array to compare to 
    for(int i=0;i<n;i++) 
     arr2[i]=i+1; 
    while(equal) 
    { 
     for(int i=0;i<n;i++) 
      equal=(arr[i]==arr2[i]); 
    } 
    return equal; 
} 

この関数は、終了することはありません最後にequalを最後の比較結果に設定します。残念ながら、私は関数が何をすべきかを正確には分かっていないので、修正する方法を教えてもらえません。

+0

私はこれを試しましたが、助けにはなりません。有効かどうかにかかわらず、どんな解決策も入力し、メッセージは印刷せずにプログラムを実行し続けます。 – Ro168

+0

@ Ro168何も印刷しないで終了するのではなく、プログラムを実行している場合は、おそらくその問題に言及する必要があります。 – JeremyP

+0

@ Ro168私は1つの無限ループを発見しました。修正された答えを見てください。 – JeremyP

関連する問題