2017-03-07 12 views
1

数日前に、このスードクパズルのランダムボックスを生成する方法について質問を投稿しました。今私はそれの境界線を生成することに困難があります。それは次のようになります: Sudokuスードクパズルの境界線を作成する

しかし、私はそれを行うためのコードを考え出すことができません。問題は、行0から8までがスドク数で占められていることです。それらを '|'にする方法はわかりません。それらの数字の間に「 - 」文字を、また私が推測する境界線にも文字があります。

#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 = -1; 
      } 
     } 
    } 


    for (int i = 0; i <= 9; i++) 
    { 

     if (i == 0) 
     { 
      for (i = 1; i <= 27; i++) 
      { 
       printf("-"); 
      } 
      printf("\n"); 
     } 
    } 
    for (int j = 0; j <= 9; j++) 
    { 
     if (j == 0) 
     { 
      for (int i = 1; i <= 9; i++) 
      { 
       printf("|"); 
       printf("\n"); 
      } 

     } 
    } 






    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; 
} 

そして、ここでは私の実行トレースです:

Enter percentage of empty squares: 50 
--------------------------- 
| 
| 
| 
| 
| 
| 
| 
| 
| 
    1  3 4 5  7 8 9 
    4 5   8 9  2 
    8   3 4 5 
    2 3   6 7   1 
      8   2  4 
      2  4 5  7 
    3  5 6    2 
     8 9  2  4 5 
    9 1 2 3 


------------------ 
(program exited with code: 0) 

私は本当にこの問題を解決する方法がわからない。ここ

は、私がこれまで試したものです。数字を印刷するときにスペースを追加すると、辺の境界線を印刷するのに十分なスペースがあるはずですが、そうは思われません。誰でも助けてくれますか?ありがとう!

編集:ありがとうございました。ない正確に絵のように、私は以下近いものでそれを来て、きましたけれども、私の改善のコードです:

for (int i = 0; i <= n*n; i++) 
    { 
     if (i == 9) 
     { 
      for (int x =0; x <= 30; x++) 
      { 
       printf("-"); 
      } 
      printf("\n"); 
      break; 
     } 

     if (i == 0 || i == 3 || i == 6) 
     { 
      for (int x =0; x <= 30; x++) 
      { 
       printf("-"); 
      } 
      printf("\n"); 
     } 
     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') 
      { 
       if (check == '1' && (j == 0 || j == 3 || j == 6)) 
       { 
        printf("| "); 
       } 
       else if (check == '1' && j == 8) 
       { 
        printf(" |"); 
       } 
       else 
       { 
        printf(" "); 
       } 
      } 
      else 
      { 
       if (j == 0 || j == 3 || j == 6) 
       { 
        printf("|%2d ",(i*n + i/n + j) % (n*n) + 1); 
       } 
       else if (check == '0' && j == 8) 
       { 
        printf("%2d |",(i*n + i/n + j) % (n*n) + 1); 
       } 
       else 
       { 
        printf("%2d ",(i*n + i/n + j) % (n*n) + 1); 
       } 

      } 

     } 
     printf("\n"); 



} 

だけ更新し、私も提案されたすべての改善により行きますよ!

+3

あなたのプログラムがで**あなたが印刷することを指示し、すべてを印刷しますあなたはそれを伝えてください**。ですから、あなたがあなたのボードを印刷する前に '| \ n' **を印刷するループを持っていれば、自然にこれが出力されます。 – StoryTeller

+2

ここでのトリックは、一度に行全体を印刷する必要があることを認識することです。すべての左側面を印刷してから、すべての数値を印刷し、次に右側のバーを印刷することはできません。代わりに、(それは決して変更されない)上部を印刷し、 'printf'ステートメントを使用して行を数字で印刷します。あなたはそれを知っていれば文字として数字を入力してください。 –

+1

ならばああなるほど。だから、境界線を別々に印刷することはできません。 –

答えて

0

ラスタを設定する必要があります。

あなたのコンソール画面はおそらく80x25文字です。その次元を調べる。

次に、配列のcharスクリーン[25] [80]を設定し、画面全体を一度にコンソールに書き込む関数を記述します。それを有効にすると、数独問題は、適切な場所に追加記号、垂直パイプ、マイナス記号を配置する問題になります。

2

数独ボードは、あなたも(あなたががしたい場合は、ループを使用することができます)ループを必要としないということは十分に小さい:

void print_line(int *start) { 
    printf("| %d %d %d | %d %d %d | %d %d %d |\n", 
     start[0], start[1], start[2], 
     start[3], start[4], start[5], 
     start[6], start[7], start[8]); 

void print_edge() { 
    printf("+-------+-------+-------+\n"); 
} 

print_board(int board[81]) { 
    print_edge(); 
    print_line(board + 0*9); 
    print_line(board + 1*9); 
    print_line(board + 2*9); 
    print_edge(); 
    print_line(board + 3*9); 
    print_line(board + 4*9); 
    print_line(board + 5*9); 
    print_edge(); 
    print_line(board + 6*9); 
    print_line(board + 7*9); 
    print_line(board + 8*9); 
    print_edge(); 
} 
関連する問題