poj 2612 Mine Sweeper

题目来源:http://poj.org/problem?id=2612

模拟,注意理解题目!输出时已经点开的位置也要标记处雷的数目!理解错了,害的WA两次了!

#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 11; bool IsCanGo(int x, int y, int n) { if(x < 0 || x >= n || y < 0 || y >= n) return false; return true; } int main() { char Graph1[MAXN][MAXN], Graph2[MAXN][MAXN], Graph3[MAXN][MAXN]; int n, i, j, k, x, y, num; bool flag; int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; while(~scanf("%d", &n)) { flag = false; memset(Graph1, 0, sizeof(Graph1)); memset(Graph2, 0, sizeof(Graph2)); for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { Graph3[i][j] = '.'; } } for(i = 0; i < n; ++i) scanf("%s", Graph1[i]); for(i = 0; i < n; ++i) scanf("%s", Graph2[i]); for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { if(Graph2[i][j] == 'x' && Graph1[i][j] == '*')//这个地方一定要注意,走过的也要标记出雷的数目,理解错了,走过的也打成'.'了,wa死了! flag = true; if(Graph2[i][j] == 'x' && Graph1[i][j] == '.') { num = 0; for(k = 0; k < 8; ++k) { x = i + dir[k][0]; y = j + dir[k][1]; if(IsCanGo(x, y, n) && Graph1[x][y] == '*') num++; } Graph3[i][j] = num + '0'; } } } if(flag) { for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { if(Graph2[i][j] == 'x' && Graph1[i][j] != '*') printf("%c", Graph3[i][j]); else if(Graph1[i][j] == '*') printf("*"); else printf("."); } printf("\n"); } } else { for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) printf("%c", Graph3[i][j]); printf("\n"); } } } return 0; } 


你可能感兴趣的:(模拟,poj,扫雷)