題目變成是踩地雷的反面玩法,算出地雷附近的數字為何,遇到地雷時,把周圍的格子都記
數一次,但在計數的時候,要注意可以計數的範圍,這部分可以先不用判斷周圍是否有 * 再
++,可以在 output 時再判斷 (> 8,因為周圍的格子最多被 + 8 次),這樣可以減少判斷式的長
度。最後 output 時,兩筆 output 之間要有一空行,但最後一筆的後面不用再多一個空行。
#include <stdio.h>
#include <stdlib.h>
int main(void){
int row,column,i,j;
int counter=0;
char c;
char board[100][100]={0};
while(scanf("%d %d%c",&row,&column,&c)!=EOF){
if(!row && !column) break;
++counter;
if(counter>1) printf("\n");
for(i=0;i<row;i++){
for(j=0;j<column;j++){
scanf("%c",&c);
if(c=='*'){
board[i][j]='*';
if( (i-1)>=0 && (j-1)>=0 ) ++board[i-1][j-1];
if( (i-1)>=0 && (j)>=0 ) ++board[i-1][j];
if( (i-1)>=0 && (j+1)<column ) ++board[i-1][j+1];
if( (i)>=0 && (j-1)>=0 ) ++board[i][j-1];
if( (i)>=0 && (j+1)<column ) ++board[i][j+1];
if( (i+1)<row && (j-1)>=0 ) ++board[i+1][j-1];
if( (i+1)<row && (j)>=0 ) ++board[i+1][j];
if( (i+1)<row && (j+1)<column ) ++board[i+1][j+1];
}
}
scanf("%c",&c);
}
printf("Field #%d:\n",counter);
for(i=0;i<row;i++){
for(j=0;j<column;j++){
if(board[i][j] > 8)
printf("*");
else
printf("%d",board[i][j]);
board[i][j]=0;
}
printf("\n");
}
}
return 0;
}
沒有留言:
張貼留言