这题不难,根据题意逐行扫描处理就可以了。如果想到使用边沿哨兵可以大大减少处理难度 返回 Volume CI 索引 返回总索引 // // 10189 - Minesweeper // Copyright (c) 2010 by Bo-wen Feng // balonfan@gmail.com // #include <set> #include <map> #include <list> #include <queue> #include <stack> #include <vector> #include <string> #include <sstream> #include <cstdio> #include <cmath> #include <limits> #include <utility> #ifndef ONLINE_JUDGE #include <fstream> std::ifstream cin("in.txt"); std::ofstream cout("out.txt"); // std::ofstream cout(stdout); #else #include <iostream> #endif typedef long long llong; typedef unsigned long long ullong; typedef long double ldouble; using namespace std; #define MAX 500 #define MINE 100 int main(int argc, char* argv[]) { int n, m; int field[MAX+2][MAX+2]; string line; int count = 1; cin>> n>> m; while(n != 0 && m != 0) { memset(field, 0, sizeof(int) * (MAX+2) * (MAX+2)); for(int i = 1; i <= n; ++i) { cin>> line; for(int j = 1; j <= m; ++j) { if(line[j-1] == '*') { field[i][j] = MINE; ++field[i-1][j-1]; // TL ++field[i-1][j ]; // T ++field[i-1][j+1]; // TR ++field[i ][j-1]; // L ++field[i ][j+1]; // R ++field[i+1][j-1]; // BL ++field[i+1][j ]; // B ++field[i+1][j+1]; // BL } } } if(count > 1) { cout<< '/n'; } cout<< "Field #"<< count++<< ":/n"; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(field[i][j] >= MINE) cout<< '*'; else cout<< field[i][j]; } cout<< '/n'; } cin>> n>> m; } return 0; }