下面是一個部分解決方案,它爲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]範圍內而不是'0' - 索引爲C預期(即在範圍[0,7 ]),因此board[col-1][row-1] = 9;
行中的1代替了
你能否證明你到目前爲止所嘗試的? – imp25
除了你所嘗試過的,你能描述一下你被教過什麼嗎? 'while while循環?你教過什麼輸入函數?還有,試着對你想要做什麼進行更具體的描述;你能展示一個你想要讀入的文件的例子,或者一個摘錄從它? –
哦,是的,我想一些基本的信息會有所幫助。我被教過/ while和do-while循環,如果語句。意味着輸入函數,所以即時猜測沒有。 –