到目前为止我得到的是一个.in文件,它将创建100个阵列,然后是板上有多少“地雷”,然后是每个“我的”两个数字,表示它们将被放置在阵列上的位置。这是我的初学C班,老实说,我们没有得到适当的教学这个先进的东西(我说使用这个术语轻率推进)。我知道如何读取文件,我知道如何创建一个数组,但我不确定如何在那么多行中读取,一遍又一遍地从地雷切换到放置。我也发现自己很困惑如何根据矿井的位置将数组编号从0更改为另一个数字。
示例输入文件:
1
4
1 3
7 5
7 3
3 3
第一行中的1
表示我们有一个电路板。下一行的4
表示它将有4枚炸弹。以下4行描述阵列中炸弹的位置为row column
。
有没有人可以指示我指出正确的方向?
答案 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。