读取文件以创建多个“扫雷”ish数组

时间:2012-11-05 16:26:03

标签: c

到目前为止我得到的是一个.in文件,它将创建100个阵列,然后是板上有多少“地雷”,然后是每个“我的”两个数字,表示它们将被放置在阵列上的位置。这是我的初学C班,老实说,我们没有得到适当的教学这个先进的东西(我说使用这个术语轻率推进)。我知道如何读取文件,我知道如何创建一个数组,但我不确定如何在那么多行中读取,一遍又一遍地从地雷切换到放置。我也发现自己很困惑如何根据矿井的位置将数组编号从0更改为另一个数字。

示例输入文件:

1
4
1 3
7 5
7 3
3 3

第一行中的1表示我们有一个电路板。下一行的4表示它将有4枚炸弹。以下4行描述阵列中炸弹的位置为row column

有没有人可以指示我指出正确的方向?

1 个答案:

答案 0 :(得分:0)

以下是部分解决方案,它留下了一些部分作为OP的练习。

#include <stdio.h>
#include <stdlib.h>

#define BOARD_SIZE 8

int main(void) {

    FILE *fp;

    fp = fopen("mines.in","r");
    if ( fp == NULL ) {
            fprintf(stderr,"Could not open file\n");
            return 1;
    }

    int nBoards = 0;
    int nMines  = 0;
    int col;
    int row;

    int currentBoard = 0;

    /* We know the first row is going to be the number of boards */
    fscanf(fp,"%d",&nBoards);

    printf("We have %d boards\n",nBoards);

    while ( fscanf(fp,"%d",&nMines) > 0 ) {
            int i,j;
            /* initialize board as all zeros */
            int board[BOARD_SIZE][BOARD_SIZE] = { {0} };

            currentBoard++;
            printf("Board %d:\n",currentBoard);

            /* Read in and set the mines */
            for (i=0; i<nMines; i++) {
                    fscanf(fp,"%d %d",&col,&row);
                    board[col-1][row-1] = 9;
            }

            /* Add mine proximity */
            for (i=0; i<BOARD_SIZE; i++) {
                    for (j=0; j<BOARD_SIZE; j++) {
                            if ( board[i][j] == 9 ) { /* we have a mine */
                                    /* Square to the left */
                                    if (j > 0 && board[i][j-1] != 9) {
                                            board[i][j-1]++;
                                    }
                                    /* Square to the right */
                                    /* Left as exercise for the OP*/

                                    /* Square above */
                                    /* Left as exercise for the OP*/

                                    /* Square below */
                                    /* Left as exercise for the OP*/
                    }
            }

            /* Print out the board */
            for (i=0; i<BOARD_SIZE; i++) {
                    for (j=0; j<BOARD_SIZE; j++) {
                            printf("%d ",board[i][j]);
                    }
                    printf("\n");
            }
            printf("\n");
    }
    fclose(fp);

    if (currentBoard != nBoards) {
            fprintf(stderr,"Expected %d boards, read in %d  boards\n",nBoards,currentBoard);
            return 1;
    }

    return 0;
}

代码在第一行读取以记录板的数量,然后它循环遍历包含矿井数量和矿场位置的数据块。 while循环将在包含地雷数量的行上执行fscanf,并且在while循环的主体中,不同的地雷位置将被读入为该板定义的数字。

一旦我们拥有所有的矿场位置,我们就可以计算出板上其他方块中的数字,其中只有一个我在代码中显示(其他类似)。

请注意,上面的代码几乎没有错误处理,几乎没有对输入文件进行验证 - 如果输入文件错误,则可能会出现错误,即对数组的“超出范围”访问。我省略了这些检查,以使程序的基础逻辑更清晰。

另请注意,我假设输入索引为'1'索引(即在[1,8]范围内,而不是像C期望的那样'0'索引(即在[0,7]范围内) ),因此在行board[col-1][row-1] = 9;中替换为1。