在Sudoku正方形中生成随机空框

时间:2017-03-05 00:20:27

标签: c

我需要想出一个程序,它生成x%的正方形,在9x9数独方块中是空白的,其中x由用户决定。要在正方形中打印的数字是预先确定的,并在问题中修复。

所以我提出了一些代码来做到这一点,但问题是它根本不起作用。我的想法是创建两个不同的数组,其中一个用于随机行,另一个用于随机列。

这是我的代码:

#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 个答案:

答案 0 :(得分:1)

    对于number = ( input / 100 ) * 81;
  • 0 <= input < 100为0,因为整数除法的结果会被截断 请改为number = input * 81 / 100;
  • 顶行和最左列不会成为空格,因为在生成随机数时会添加额外的一行 尝试使用row_random [k] = rand () % 9;column_random [k] = rand () % 9;
  • 只有row_randomcolumn_random的最后一个元素才有效,因为只要条件'0'为假,就会check分配给j == column_random [k] && i == row_random [k]。 在循环check = '0';之前移动for ( k = 0; k < number; k++ )
  • 将使用具有自动存储时间check的未初始化变量的值来调用未定义的行为,这在number = 0时是不确定的。 声明时初始化check
  • 为非空格(check == '0')打印两个字符,但只为空格(check == '1')打印一个字符,因此格式将被破坏。
    如果你愿意,可以再打印一个空格字符。

这些更改会使行为更好,但空格数可能会少于预期,因为可能会选择重复的位置。 为避免这种情况,你应该

  1. 在一个阵列中列出所有9 * 9个位置。
  2. 随机播放阵列。
  3. 获取混洗数组的第一个number元素,并将它们用作转向空格的位置。