题目来源:
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 ; }