2017-03-05 19 views
0

xがユーザによって決まる9×9数独四角形で空白のx%の数を生成するプログラムを考え出す必要があります。正方形に印刷される数字は、あらかじめ決められており、問題に固定されています。数独四角形のランダムな空のボックスを生成する

私はそれを行うためのコードを考え出しましたが、問題は全く機能しないということです。私の考えは、ランダムな列とランダムな列の2つの異なる配列を作成することです。ここで

は私のコードです:

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

int main() 
{ 
    int column_random [81], row_random [81], n = 3, k, j, input, number; 
    char check = '0'; 

    printf("Enter percentage of empty squares: "); 
    scanf("%d", &input); 

    srand (time (NULL)); 

    number = (input * 81)/100 ; 

    for (k = 0; k < number; k++) 
    { 
     row_random [k] = rand() % 9 ; 
     column_random [k] = rand() % 9 ; 

     for (j = 0; j < k; j++) 
     { 
      if (row_random [j] == row_random [k] && column_random [j] == column_random [k]) 
      { 
       row_random [k] = rand() % 9 ; 
       column_random [k] = rand() % 9 ; 
       j = 0; 
      } 
     } 
    } 


    for (int i = 0; i < n*n; i++) 
    { 
     for (int j = 0; j < n*n; j++) 
     { 
      for (k = 0; k < number; k++) 
      { 
       check = '0'; 
       if (j == column_random [k] && i == row_random [k]) 
       { 
        check = '1'; 
        break; 
       } 
       else 
       { 
        check = '0'; 
       } 
      } 

      if (check == '1') 
      { 
       printf(" "); 
      } 
      else 
      { 
       printf("%d ",(i*n + i/n + j) % (n*n) + 1); 
      } 

     } 
     printf("\n"); 
    } 

    return 0; 
} 

誰もが私のコードで間違って何を教えてもらえますか?または私のアイデア/コンセプトが間違っていれば? ありがとう!

答えて

1
  • number = (input/100) * 81;は、整数除算の結果が切り捨てられるため、0 <= input < 100では0になります。
    代わりにnumber = input * 81/100;を試してください。
  • 乱数を生成するときに余分な1が追加されるため、一番上の行と一番左の列はスペースになりません。
    row_random [k] = rand() % 9;column_random [k] = rand() % 9;
  • 条件j == column_random [k] && i == row_random [k]が偽の時はいつでも'0'checkに割り当てられているためだけrow_randomcolumn_randomの最後の要素が有効であるを使用してみてください。
    ループfor (k = 0; k < number; k++)の直前に、check = '0';を移動します。
  • 定義されていない動作は、自動保存期間がcheckの未初期化変数の値を使用して呼び出されます。これは不確定です。number = 0
    宣言時にcheckを初期化します。
  • 空白以外の文字(check == '0')には2文字が印刷されますが、スペース(check == '1')には1文字しか印刷されないため、フォーマットが壊れます。
    必要に応じてスペースのためにもう1文字を印刷しましたか?

これらの変更により、動作は改善されますが、重複する位置が選択される可能性があるため、スペースの数が予想よりも少なくなる可能性があります。 これを避けるには、

  1. すべての9 * 9の位置を1つの配列にリストアップする必要があります。
  2. 配列をシャッフルします。
  3. シャッフルされた配列の最初のnumber要素を取り出し、スペースとして使用する場所として使用します。
+0

ありがとうございました!あなたの提案でコードを編集しました。私は100%を入力しても、それは常に1つのエントリを生成するという事実を除いて、ほとんどの場合動作します。私は今回のコードで何が間違っているのか分かりません。 –

+0

ああ、エラーが発見されました。 jは0の代わりに-1にする必要があります。 –

関連する問題