题目来源:

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1173

 

代码如下:

vector< pair<int, int> >Little5; // 每个单元是一个点的坐标
vector< vector<pair<int,int > > >AllLittle5; // 每个单元放的是5个点,即一个点数组
void Init(){ //计算所有5虎的坐标
    Little5.clear();
    Little5.push_back(make_pair(0,0));
    Little5.push_back(make_pair(0,2));
    Little5.push_back(make_pair(1,1));
    Little5.push_back(make_pair(2,0));
    Little5.push_back(make_pair(2,2));
    AllLittle5.clear();
    int i,j,k,x,y;
    vector< pair<int, int> > tmp;
    for(i=0; i<3; i++){
        for(j=0;j<3;j++){
            tmp.clear();
            for(k=0; k<Little5.size(); k++){
                x=i+Little5[k].first;
                y=j+Little5[k].second;
                tmp.push_back(make_pair(x,y));
            }
            AllLittle5.push_back(tmp);
        }
    }
}
int g[8][8]; // 坐标从0开始

int getBig5(){
    return g[0][0] && g[0][4] && g[2][2] && g[4][0] && g[4][4];
}
int getLittle5(){
    vector<pair<int,int> >tmp;
    int i,k,x,y,ans=0;
    for(k = 0 ; k< AllLittle5.size(); k++){
        tmp=AllLittle5[k];
        for(i=0 ; i<tmp.size(); i++){
            x=tmp[i].first;
            y=tmp[i].second;
            if(!g[x][y])
                break;
        }
        if(i == tmp.size() ) ans++;
    }
    return ans;
}
int getTongtian(){
    int ans=0,i,j;
    for(i=0 ; i<5; i++){
        for(j=0; j<5; j++){
            if(!g[i][j])
                break;
        }
        if(j==5) ans++;
    }
    for(j=0;j<5;j++){
        for(i=0;i<5;i++){
            if(!g[i][j])
                break;
        }
        if(i==5) ans++;
    }
    if( g[0][0] && g[1][1] && g[2][2] && g[3][3] && g[4][4] ) ans++;
    if( g[0][4] && g[1][3] && g[2][2] && g[3][1] && g[4][0] ) ans++;
    return ans;
}
int get4(){
    int ans=0;
    if(g[0][3] && g[1][2] && g[2][1] && g[3][0] ) ans++;
    if(g[1][0] && g[2][1] && g[3][2] && g[4][3] ) ans++;
    if(g[1][4] && g[2][3] && g[3][2] && g[4][1] ) ans++;
    if(g[0][1] && g[1][2] && g[2][3] && g[3][4] ) ans++;
    return ans;
}
int get3(){
    int ans=0;
    if( g[0][2] && g[1][1] && g[2][0] ) ans++;
    if( g[2][0] && g[3][1] && g[4][2] ) ans++;
    if( g[2][4] && g[3][3] && g[4][2] ) ans++;
    if( g[0][2] && g[1][3] && g[2][4] ) ans++;
    return ans;
}
int xiaodou(){
    int i,j,ans=0;
    for(i=0; i<4; i++)
    {
        for(j=0; j<4 ;j++){
            if( g[i][j] && g[i][j+1] && g[i+1][j] && g[i+1][j+1] ) ans++;
        }
    }
    return ans;
}
char str[8][8];
int  main(){
    int t,i,j,ans;
    cin>>t;
    Init();
    while(t--){
        for( i=0; i<5; i++)
            cin>>str[i];
        memset(g,0,sizeof(g));
        ans=0;
        for(i=0; i<5 ;i++)
            for(j=0; j<5 ;j++){
                if(str[i][j] == 'x')
                    g[i][j]=1;
            }
        ans=getBig5()*10
        + getLittle5()*5
        + getTongtian()*5
        + get4()*4
             + get3()*3
             + xiaodou();
        printf("%d ",ans);
        ans=0;
        memset(g,0,sizeof(g));
        for(i=0; i<5 ;i++)
            for(j=0; j<5 ;j++){
                if(str[i][j] == 'o')
                    g[i][j]=1;
            }
        ans=getBig5()*10 + getLittle5()*5 + getTongtian()*5 + get4()*4
             + get3()*3 + xiaodou();
        printf("%d\n",ans);
    }
     return 0 ;
}