我目前正在研究一个数独验证器,我这样做的方法是将每一行分成长度为9的数组并检查,将每列分成长度为9的数组并检查等等。我已经完成了行已经做了类似的事情
for( i=0; i<9; i++)
fscanf(file, "%1d", &row1[i]);
for( i=0; i<9; i++)
fscanf(file, "%1d", &row2[i]);
for( i=0; i<9; i++)
fscanf(file, "%1d", &row3[i]);
for( i=0; i<9; i++)
fscanf(file, "%1d", &row4[i]);
它的工作方式也是我想要的。
我的数独搜索解决方案中的每个数字都被水平空格隔开,并且在我的文件中垂直相邻。
但是,我在尝试将每列扫描到数组时遇到问题。基本上我认为我需要做的是第一列开始于第一个(左上角)字符并将其存储到我的数组的第一个插槽中。然后我需要跳过9个字符,然后存储该字符。
我以为我可以做类似
的事情 for( i=0; i<82; i += 9)
fscanf(file, "%1d", &col1[i]);
for( i=1; i<82; i+=9)
fscanf(file, "%1d", &col2[i]);
for( i=2; i<82; i+=9)
fscanf(file, "%1d", &col3[i]);
for( i=3; i<82; i+=9)
fscanf(file, "%1d", &col4[i]);
for( i=4; i<82; i+=9)
但我意识到它没有用,因为我已经将我的数组设置为9号,因为我插入数组中的第i个值,这样就不会像它想要的那样。
任何人都可以给我一个如何实现这个的建议吗?我认为这是相当微不足道的,但我在缠绕它时遇到了严重的麻烦。
由于
编辑:我还需要为该地区执行此操作,因此我基本上寻找一种方法来跳过文件并仅存储我想要的某些字符。
答案 0 :(得分:3)
因为它是一个数独验证器,所以创建一个9 * 9的二维数组,并像你一样读取行。然后以行方式或列方式循环以验证您的数独方块。
// As pointed out in comments, this code assumes you have a minimum of 9*9 separated ints with width = 1.
// If not, you need to check whether fscanf failed or not.
int sudoku[9][9] ;
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
fscanf(file_ptr, "%1d", &sudoku[i][j]); /* Check for the return value
* of fscanf if it is not
* guaranteed that there
* will always be 81 elements
* to read from or some other
* error occurred while
* reading the file.
*/
// now use sudoku to verify.
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
{
// sudoku[i][j] is row wise.
// sudoku[j][i] is column wise.
}
我假设您正在使用C99或更高版本的编译器。如果是C89,则需要在函数开头(循环外)移动int i
和int j
声明。
答案 1 :(得分:0)
使用简单的过滤器躲避所有计数和跳过并读取为单个字符。毕竟,您只对从1
到9
的81位数感兴趣,总是以正确的顺序显示 - 无论其他格式或新的内容是什么地点。如果您还为未知单元格添加了0
或.
,则可以阅读此类格式
1..|...|7..
.2.|...|5..
6..|38.|...
-----------
.78|...|...
...|6.9|...
...|...|14.
-----------
...|.25|..9
..3|...|.6.
..4|...|..2
还有这个
000605000003020800045090270500000001062000540400000007098060450006040700000203000
(从http://www.sudocue.net/fileformats.php中随机选取的例子)