hunnu 11082 The Minesweeper Game(BFS)

原创 2012年03月26日 20:28:58

题目来源     :        http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11082


广度搜索bfs    

最后输出的不为“#”的部分,实际上是指1、(点击处若为0)处于此处八个方向内且为0(相当于一个“感染区”)并且这个“感染区”的八个方向除了是0的情况,就必须被不为0且不为地雷的包围)。所以,从点击点开始宽度搜索它的八个方向,若其中某方向地雷数为0,则将此处的x、y压入队列,并标记此处已被访问,此处因为判断为0后,vis[x][y]会由-1更新为find(x,y),所以,当需要判断此处是否被访问过,只要查找vis[x][y]的值是否为-1即可。又由于输出中不为0且不为“#”的vis[x][y]是包围着0的(即它的八个方向中一定有0的存在,且在包围内),所以更新不为0的vis[x][y]的条件就是:have_0() 八个方向是否有0存在。

另外,需要注意的是,边界情况,所以当判断have_0()时,一定要限制x>=1&&x<=16&&y>=1&&y<=30;


代码:

#include<iostream>
#include<string.h>
using namespace std;
char map[50][50];
int vis[50][50];
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
typedef struct 
{
        int x,y;
}D;
D quee[10000];
int have_0(int x,int y)
{
      int flag=0;
      for(int i=0;i<8;i++)
      {
              int a=x+dir[i][0];
              int b=y+dir[i][1];
              if(vis[a][b]==0&&a>=1&&a<=16&&b>=1&&b<=30)   {flag=1;return 1;}
      }
      if(flag==0) return 0;
}
int find(int x,int y)
{
    int num=0;
    if(map[x-1][y-1]=='*') num++;
    if(map[x-1][y]=='*') num++;
    if(map[x-1][y+1]=='*') num++;
    if(map[x][y-1]=='*') num++;
    if(map[x][y+1]=='*') num++;
    if(map[x+1][y-1]=='*') num++;
    if(map[x+1][y]=='*') num++;
    if(map[x+1][y+1]=='*') num++;
    return num;
}
void bfs(int x,int y)
{         
       int front,rear;
       front=rear=0;
       quee[rear].x=x;quee[rear++].y=y;
      
       vis[x][y]=find(x,y);   
       int nx,ny;
       while(front<=rear)
       {                 
              nx=quee[front].x;
              ny=quee[front++].y;
              for(int i=0;i<8;i++)
              {
                      int a,b;
                      a=nx+dir[i][0];b= ny+dir[i][1];   
                      if(have_0(a,b)==1&&map[a][b]!='*'&&vis[a][b]==-1&&a>=1&&a<=16&&b>=1&&b<=30)   
                      {
                               vis[a][b]=find(a,b);  
                                if(find(a,b)==0)      {quee[rear].x=a;quee[rear++].y=b;}
                      }
                     
                     
              }
       }
}
int main()
{
    int t;
    int x,y;
    char str[50];
    scanf("%d",&t);
    while(t--)
    {
          scanf("%d%d",&x,&y);
          for(int i=0;i<=17;i++)
          for(int j=0;j<=31;j++)   vis[i][j]=-1;
          for(int i=1;i<=16;i++)
          {
                  scanf("%s",str);
                  for(int j=1;j<=30;j++)
                    {map[i][j]=str[j-1];  }
          }
          bfs(x,y);
          for(int i=1;i<=16;i++)
          {
                  for(int j=1;j<=30;j++)
                  {
                          if(vis[i][j]!=-1)  printf("%d",vis[i][j]);
                          else printf("#");
                   //   cout<<vis[i][j];
                  }
                 printf("\n");
          } 
          if(t!=0) printf("\n");     
    }


    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hunnu 11127 gaussing game 差分约束

Jaehyun has two lists of integers, namely a1, . . . , aN and b1, . . . , bM. Jeffrey wants to know w...

BFS 蛇和梯子 HUNNU

蛇和梯子Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KBTotal submit users: 5, Accept...

BAPC2014 B&&HUNNU11582:Button Bashing(BFS)

题意: 给出n,m,代表微波炉有n个按钮,要求达到总时间为m 然后给出n个数,代表n个按钮能增加的时间,问最少几步,能够使得按出的总时间大于等于要求的时间,并且相差最小 输出最小的步数与相差的最小值 ...

[BFS]529. Minesweeper

【记又一次阵亡在“==”上的惨痛经历】 题目: Let's play the minesweeper game (Wikipedia, online game)! You are gi...

FZU 2150 Fire Game (BFS)

题目链接: FZU 2150 Fire Game (BFS) 题目大意: n* m 场地,#表示草坪 ,每次选两个草坪,可以向周围四块草丛扩展,扩散时间为1秒,求最少时间,扩散整个草坪. 思路...

POJ 1753 Flip Game(BFS)

一个4*4的棋盘,每次选一个位置,将该位置及其上下左右共5个位置的棋子翻转,问最少翻转多少次可以使16个棋子颜色一样。 由于棋盘已经固定为4*4的大小,所以可以用一个二进制数来表示当前整个棋盘的状态。

FZU 2150 Fire Game (暴力BFS)

【题目链接】click here~~ 【题目大意】: 两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着...

【BFS】FZU 2150 Fire Game

Problem Description 给你T组数据,给你一个n,m的矩阵,.#分别代表空地,草丛。让你找两个草丛,开始烧,要求把所有的草都烧完,所需要最少的时间。烧一个草可以向上下左右扩散,扩散...

fzu 2150 Fire Game_(bfs)

这题说真的对于我这种新手来说还真是

POJ 1101 The Game(BFS+判方向)

The Game Description One morning, you wake up and think: "I am such a good programmer. Why not...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)