poj 2920 Mine Map【BFS】

来源:互联网 发布:c语言主要应用领域 编辑:程序博客网 时间:2024/05/15 12:58

Mine Map
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 1023 Accepted: 493

题目大意:

        给一个n*n的金库,金库中有地雷‘*’和空格'?',现在你从金库中间出发,刚刚开始时,【遍历当前格子周围8个格子,如果周围8个格子有一个地雷,则把当前格子标记为 ‘ # ’,如果没有,你可以移动到当前格子的周围8个格子中的任意一个格子,且把当前格子标记为  ‘ . ’ 】然后重复【】中的步骤,直到把所有能走的格子都走过为止。

分析:

        刚刚开始时,把map[][]数组初始化为‘?’,【注意,是8个方向都可以走】。

        在走的过程中,遇到‘.’或'#'时【这些是已走过的标记】,就不要再走了【浪费时间嘛】,

已Accept代码【C++提交】

#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>using namespace std;char map[301][301];int dx[] = {0, 0, 1, -1, 1, 1, -1, -1};//注意8个方向 int dy[] = {-1, 1, 0, 0, 1, -1, 1, -1};int n, m;int r, c;int x, y;struct Node {int x, y;Node () {}Node (int x, int y) : x(x), y(y) {}};bool Decide(int a, int b) {for(int i = 0; i < 8; i++) {int kx = a + dx[i];int ky = b + dy[i];if(kx >= 1 && kx <= n && ky >= 1 && ky <= n && map[kx][ky] == '*')//是否越界 return true;}return false;}void BFS() {queue <Node> Q;while(!Q.empty())Q.pop();if(Decide(x, y))map[x][y] = '#';elsemap[x][y] = '.';if(map[x][y] == '.')Q.push(Node(x, y));while(!Q.empty()) {Node k = Q.front();Q.pop();int nx = k.x;int ny = k.y;for(int j = 0; j < 8; j++) {int cx = nx + dx[j];int cy = ny + dy[j];if(cx >= 1 && cx <= n && cy >= 1 && cy <= n && map[cx][cy] == '?') {if(Decide(cx, cy))map[cx][cy] = '#';elsemap[cx][cy] = '.';if(map[cx][cy] == '.')//周围为则入队 Q.push(Node(cx, cy));}}}}int main() {int T, K = 1;scanf("%d", &T);while(T--) {scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)map[i][j] = '?';for(int i = 1; i <= m; i++) {scanf("%d%d", &r, &c);map[r][c] = '*';}x = y = (n + 1) / 2;BFS();printf("Scenario #%d:\n", K++);for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {printf("%c", map[i][j]);}printf("\n");}printf("\n");//注意 输出 格式 }system("pause");return 0;}

0 0
原创粉丝点击