为数独拼图创建边框线

时间:2017-03-07 16:18:40

标签: c

几天前我发布了一个关于为这个数独谜题生成随机框的问题。现在我很难为它生成边界线。它应该如下所示: 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");   



}

只是一个更新,我也将完成所有建议的改进!

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

您需要设置栅格。

您的控制台屏幕可能是80x25字符宽。找出它的尺寸。

然后设置一个数组字符屏幕[25] [80],并编写一个函数将整个屏幕一次性写入控制台。让它工作,然后数独问题成为在正确的位置放置附加标志,垂直管道和减号的问题。