以下は部分的な解決策であり、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 つだけです (他も同様です)。
上記のコードは入力ファイルのエラー処理と検証をほとんど行わないことに注意してください。入力ファイルが間違っていると、配列への「範囲外」アクセスなどのエラーが発生する可能性があります。プログラムの根底にあるロジックをより明確にするために、そのようなチェックを省略しました。
また、入力インデックスは、C が期待する '0' インデックス (つまり、[0,7] の範囲) ではなく、'1' のインデックス (つまり、[1,8] の範囲) であると想定していることにも注意してください。行中の 1 の置換board[col-1][row-1] = 9;
。