几天前我发布了一个关于为这个数独谜题生成随机框的问题。现在我很难为它生成边界线。它应该如下所示:
但是我无法想出代码来做到这一点。问题是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");
}
只是一个更新,我也将完成所有建议的改进!
答案 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],并编写一个函数将整个屏幕一次性写入控制台。让它工作,然后数独问题成为在正确的位置放置附加标志,垂直管道和减号的问题。