我正在尝试将我的数独求解程序的结果打印到终端中,如下所示:
+-------+-------+-------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
+-------+-------+-------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
+-------+-------+-------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
+-------+-------+-------+
我将我的解决方案存储在一维数组中,但我找不到打印它的方法。这是我到目前为止所提出的:
printf("| %c %c %c | %c %c %c | %c %c %c |\n", test[0],test[1],test[2],test[3],test[4],test[5],test[6],test[7],test[8]);
我不能使用任何周期,因为我需要绘制"墙壁"数字周围。有没有更好的方法呢?为什么
char test[] = {'1','2','3','4','5','6','7','8','9'};
int i = 0;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++]);
返回| 9 8 7 | 6 5 4 | 3 2 1 |
感谢。
答案 0 :(得分:5)
这是将其分解为(嵌套)循环的一种方法:
void print_data_row(const char *p) {
printf("|");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf(" %c", p[i*3 + j]);
}
printf(" |");
}
printf("\n");
}
void print_separator(void) {
printf("+-------+-------+-------+\n");
}
...
print_separator();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
print_data_row(&board[(i*3 + j) * 9]);
}
print_separator();
}
答案 1 :(得分:1)
Q值。有没有更好的方法呢? A.尝试使用loops来实现相同目标。
对于你的第二个问题,答案是函数参数的评估顺序在C中是不确定的。因此,你永远不知道,这9个test[i++]
中的哪一个首先被评估。因此,未知结果(实际上是未定义的行为)。更多here。
答案 2 :(得分:1)
没有循环?好。 与单个或嵌套循环相比,我倾向于说这甚至是卓越的解决方案。它可以看来做它应该做的事情。
char *t = test;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
printf("+-------+-------+-------+\n");
答案 3 :(得分:1)
试试这个:
for(int i = 0; i < 13; i++){ // 13 because 9 numbers + 4 separators
for(int j = 0; i < 13; i++){
if((i % 4 == 0) && (j % 4 == 0)){
printf("+"); // separator crossing
} else if (i % 4 == 0){
printf("-"); // vertical separator
} else if (j % 4 == 0){
printf("|"); // horizontal separator
} else {
printf("%d",sudoku[row(i)][row(j)]); // sudoku is the 2d result array
}
printf("\n"); // end of line
}
int row(j){ // row (or column) without counting separators
int nOfSeparator = (i - (i % 4))/4;
return (13 - nOfSeparator);
}