FZU 1920 Left Mouse Button 解题报告

题意:告诉扫雷的所有规则,主要是成片消去雷的规则,即一块四周都没有雷的地方会消失,直到周围有雷,周围有雷的地方会留下一个数字,表示周围八个方向雷的总个数。还给出了雷的分布。问至少点击几次鼠标左键,可以找出所有雷。

解法:bfs。找出全为0的区域的块数a1,给边界上的数字做上标记,再统计没被标记的非0数字个数a2, ans = a1+a2

//Memory: 236 KB		
//Time: 0 MS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <queue>
#include <cstring>
#define MAXN 110
#define MP(x,y) make_pair((x),(y))
#define FI first
#define SE second
using namespace std;
const int dir[8][2]={{0,1},{1,0},{-1,0},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
char ma[MAXN][MAXN];
void bfs(int x,int y)
{
    queue<pair<int,int> >que;
    que.push(MP(x,y));
    while(que.size())
    {
        x=que.front().FI,y=que.front().SE;
        que.pop();
        if(ma[x][y]!='0')
        {
            ma[x][y]='*';
            continue;
        }
        ma[x][y]='*';
        for(int i=0;i<8;++i)
            que.push(MP(x+dir[i][0],y+dir[i][1]));
    }
}
int main()
{
    //freopen("/home/moor/Code/input.txt","r",stdin);
    int ncase,n,ans;
    scanf("%d",&ncase);
    for(int h=1;h<=ncase;++h)
    {
        scanf("%d",&n);
        memset(ma,0,sizeof(ma));
        for(int i=1;i<=n;++i)
            scanf("%s",&ma[i][1]);
        ans=0;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                if(ma[i][j]=='0')
                    bfs(i,j),++ans;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                if(ma[i][j]>='1'&&ma[i][j]<='8')
                    ++ans;
        printf("Case %d: %d\n",h,ans);
    }
}


你可能感兴趣的:(FZU 1920 Left Mouse Button 解题报告)