0

これまでに得たのは、100 個の配列を作成する .in ファイルで、その後にボード上にある「地雷」の数と、配列上のどこに配置されるかを表す「地雷」ごとに 2 つの数字が続きます。これは私の初心者向けの C クラスであり、正直なところ、これほど高度なものについては適切に教えられていません (上級という用語を軽く使って言っています)。私はファイルを読み込む方法と配列を作成する方法を知っていますが、地雷から配置に​​何度も切り替えて、その多くの行を読み込む方法がわかりません。また、地雷が配置されている場所に基づいて配列番号を 0 から別の番号に変更する方法についても混乱しています。

入力ファイルの例:

1
4
1 3
7 5
7 3
3 3

最初1の行の は、1 つのボードがあることを意味します。次の行の4は、爆弾が 4 つあることを意味します。次の 4 行は、配列内の爆弾の位置を として記述していrow columnます。

誰かが私を正しい方向に向けるために提供できるものはありますか?

4

1 に答える 1

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 つだけです (他も同様です)。

上記のコードは入力ファイルのエラー処理と検証をほとんど行わないことに注意してください。入力ファイルが間違っていると、配列への「範囲外」アクセスなどのエラーが発生する可能性があります。プログラムの根底にあるロジックをより明確にするために、そのようなチェックを省略しました。

また、入力インデックスは、C が期待する '0' インデックス (つまり、[0,7] の範囲) ではなく、'1' のインデックス (つまり、[1,8] の範囲) であると想定していることにも注意してください。行中の 1 の置換board[col-1][row-1] = 9;

于 2012-11-06T11:27:02.947 に答える