UVALive 2517 Moving Object Recognition(模拟)

  题目看上去很吓人,很高端,但其实很简单,不要被吓到,照搬题目的公式就可以了。

  方法:用BFS求出最大块和重心,找出题目公式需要的未知量,然后套到题目公式里就可以求出答案了。

  代码:

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 550
int n,m,go[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int vis[N][N],Max;
char maps[N][N],op[N];
double X[N*1000],Y[N*1000];
struct Pos
{
    int x,y;
};
bool in_maps(int x,int y)
{
    return (x>=1 && x <= n && y>=1 && y<=m);
}
int bfs(int sx,int sy)
{
    queue<Pos> que;
    while(!que.empty()) que.pop();
    Pos now,nxt;
    now.x = sx;  now.y = sy;
    que.push(now);
    int tot = 0;
    vis[sx][sy] = 1;
    while(!que.empty())
    {
        now = que.front();
        que.pop();
        tot++;
        for(int i = 0; i < 4; i++)
        {
            nxt.x = now.x + go[i][0];
            nxt.y = now.y + go[i][1];
            if(in_maps(nxt.x,nxt.y) && !vis[nxt.x][nxt.y] && maps[nxt.x][nxt.y]=='x')
            {
                que.push(nxt);
                vis[nxt.x][nxt.y] = 1;
            }
        }
    }
    return tot;
}
void get_Max()
{
    int nxtx,nxty,tmp,startx,starty;
    Max = -99999999;
    memset(vis,0,sizeof(vis));
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(maps[i][j] == 'x' && !vis[i][j])
            {
                tmp =  bfs(i,j);
                if(tmp > Max)
                {
                    Max = tmp;
                    startx = i;
                    starty = j;
                }
            }
        }
    }
   // printf("Max = %d
",Max);
   // printf("sx = %d sy = %d
",startx,starty);
    memset(vis,0,sizeof(vis));
    bfs(startx,starty);
}
void get_xy(int k)
{
    double sumx = 0,sumy = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(vis[i][j])
            {
                sumy += (j*1.0);
                sumx += (i*1.0);
            }
        }
    }
    sumx /= Max;
    sumy /= Max;
    X[k] = sumx;
    Y[k] = sumy;
}
int main()
{
    int T;
    double ansx,ansy;
    while(~scanf("%d%d",&m,&n))
    {
        if(n+m==0) break;
        T = 0;
        while(1)
        {
            for(int i = 1; i <= n; i++)
            {
                scanf("%s",maps[i]+1);
            }
            scanf("%s",op);
            get_Max();
            get_xy(T);
            T++;
            if(op[0]=='=') break;
        }
        //printf("T = %d
",T);
        T /= 2;
        ansx = ansy = 0.0;
        for(int i = 0; i < T; i++)
        {
            ansx += (X[i+T] - X[i]);
            ansy += (Y[i+T] - Y[i]);
        }
        ansx /= (T*T);
        ansy /= (T*T);
        printf("%.2lf %.2lf
",ansy,ansx);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5723194.html