2014年7月6日 星期日

uva 10189 Minesweeper

題目變成是踩地雷的反面玩法,算出地雷附近的數字為何,遇到地雷時,把周圍的格子都記

數一次,但在計數的時候,要注意可以計數的範圍,這部分可以先不用判斷周圍是否有 * 再

++,可以在 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;
}

沒有留言:

張貼留言