【問題描述】 掃雷游戲是一款十分經典的單機小游戲。在 n 行 m 列的雷區中有一些格子含有地雷(稱之為地雷格),其他格子不含地雷(稱之為非地雷格)。玩家翻開一個非地雷格時,該格將會出現一個數字——提示周圍格子中有多少個是地雷格。游戲的目標是在不翻出任何地雷格的條件下,找出所有的非地雷格。 現在給出n行m列的雷區中的地雷分布,要求計算出每個非地雷格周圍的地雷格數。 注:一個格子的周圍格子包括其上、下、左、右、左上、右上、左下、右下八個方向上與之直接相鄰的格子。 【輸入格式】 輸入文件名為 mine.in。 輸入文件第一行是用一個空格隔開的兩個整數n和m,分別表示雷區的行數和列數。 接下來 n 行,每行 m 個字符,描述了雷區中的地雷分布情況。字符’*’表示相應格子是地雷格,字符’?’表示相應格子是非地雷格。相鄰字符之間無分隔符。 【輸出格式】 輸出文件名為 mine.out。 輸出文件包含 n 行,每行 m 個字符,描述整個雷區。用’*’表示地雷格,用周圍的地雷個數表示非地雷格。相鄰字符之間無分隔符。 【輸入樣例 1】 3 3 *?? ??? ?*? 【輸出樣例1】 *10 221 1*1 【輸入樣例 2】 2 3 ?*? *?? 【輸出樣例2】 2*1 *21 【數據說明】 對于 100%的數據,1≤n≤100,1≤m≤100。 問題分析: 考察:二維字符數組、暴力枚舉 對二維字符數組的處理操作跟二維整型數組處理方式一樣。 如何表示某個點的八個方向 方法1: 例如點(x,y)的上右下左,左上,左下,右下,右上八個方向的表示方法: 上:(x-1,y) 右:(x,y+1) 下:(x+1,y) 左:(x,y-1) 左上:(x-1,y+1) 左下:(x+1,y+1) 右下:(x+1,y-1) 右上:(x-1,y-1) 方法2: int dx[8]= {-1,0,1,0,-1,1,1,-1}; //上右下左,左上,左下,右下,右上 int dy[8]= {0,1,0,-1,1,1,-1,-1}; 例如點(x,y)的上右下左,左上,左下,右下,右上八個方向的表示方法: 上:(x+dx[0],y+dy[0]) 右:(x+dx[1],y+dy[1]) 下:(x+dx[2],y+dy[2]) 左:(x+dx[3],y+dy[3]) 左上:(x+dx[4],y+dy[4]) 左下:(x+dx[5],y+dy[5]) 右下:(x+dx[6],y+dy[6]) 右上:(x+dx[7],y+dy[7]) 如果同時要遍歷八個方向,就可以使用循環來表示: for(int i = 0;i < 8;i++){ int tx = x + dx[i]; int ty = y + dy[i]; } 處理過程: 1)輸入二維字符數組表示地圖 2)循環遍歷二維字符數組中的每個字符 3)判斷該字符如果是地雷就輸出'*',如果不是地雷就判斷八個方向上的字符是否為地雷,是則數量加1。 注意:二維數組的下標越界問題。 參考程序: |
|