从文本文件读取和处理到2D整数数组,其间有语句

时间:2014-10-09 18:53:53

标签: c breadth-first-search

我正在使用广度优先搜索来制作迷宫求解器。请考虑文本文件中的以下数字列表

10 20
1 1
10 20
5 1
4 2
3 3
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3

第一行表示迷宫(10x20)的大小,第二行表示起始位置坐标(1x1),第三行表示结束位置(10x20)。第三行之后的每一行代表迷宫中的一个块所在的坐标(也就是必须在它周围移动)。

这是特定电路板的样子:

**********************
*s........*..........*
*........*...........*
*..*....*............*
*.*....*.............*
**....*..............*
*....*...............*
*...*................*
*..*.................*
*....................*
*...................e*
**********************

我想做什么: 如果我的文本文件的大小或开始/结束坐标的坐标不可能,请忽略这些坐标并继续处理输入。

示例:

10 0 => Invalid: Maze sizes must be greater than 0
15 7 => Maze becomes size 15 x 7
10 20 => Invalid: column 20 is outside range from 1 to 7 
5 1 => Starting position is at position 5, 1
24 2 => Invalid: row 24 is outside of range from 1 to 15 
3 3 => Ending position is at position 3, 3
1 10 => Invalid: column 10 is outside range from 1 to 7
2 9 => Invalid: column 9 is outside range from 1 to 7
3 8 => Invalid: column 8 is outside range from 1 to 7
4 7
5 6
5 1 => Invalid: attempting to block starting position
6 5
7 4
8 3

我知道我应该使用一些fprintf或fscanf循环,直到文件结束。 有人能让我朝着正确的方向开始吗?

如果需要,我想打印文件中的所有坐标,并在行中进一步显示错误消息。

1 个答案:

答案 0 :(得分:0)

问题是你试图询问如何阅读所有要点?如果是这样,您可以执行以下操作:

int n1, n2;
FILE * fp = fopen("myfile.txt", "r");

//...read first three lines and do what you need with them

//read rest of points
while( fscanf(fp, "%d %d", &n1, &n2) ) {
   if (checkPoints(n1,n2))        // check points are valid
        addPointsToBoard(n1,n2);  // add to board
}

如果您正在询问如何实施checkPoints之类的内容,我会说您没有提供足够的信息,说明您计划如何为有人提供帮助来实施代码

注意:这假设您有一个格式正确的输入文件。如果您担心无效输入,则需要进行健全性检查

编辑根据评论,这里有一种方法可以对矩阵大小输入进行健全性检查(第一行)

int valid_size = 0;
while(1) {
    if ( fsanf(fp, "%d %d", &n1, &n2) ) 
         valid_size = checkMatrixSizes(n1,n2);
    else
         exit(1);  //never finding valid matrix size in file
    if (valid_size)
        break
}

上面的循环将一直循环,直到checkMatrixSizes找到有效的大小(我还怀疑它会创建你的板,等等。上面是伪代码,远未完成)。您可以为第二个和第三个输入执行类似的循环。应该注意的是,这段代码只是忽略了任何无效的输入并继续前进,我认为这是你想要的行为基于你的问题。其他行为可能包括将输入调整为最接近的可接受值(即,如果列超出范围,则将列设置为最高可能值)。