模拟题。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=20; char g[maxn][maxn]; bool vis[maxn][maxn],flag[maxn][maxn]; int dir[][4]={{-1,0},{1,0},{0,-1},{0,1}}; class ball { public: int max,x,y; }; int dfs(int x,int y) { int i,ans=1; for(i=0;i<4;i++) { int tempx=x+dir[i][0]; int tempy=y+dir[i][1]; if(tempx>=1&&tempx<=10&&tempy>=1&&tempy<=15) { if(vis[tempx][tempy]&&flag[tempx][tempy]&&g[x][y]==g[tempx][tempy]) { flag[tempx][tempy]=false; ans+=dfs(tempx,tempy); } } } return ans; } void update() { int i,j,k; for(j=1;j<=15;j++) { for(i=1;i<10;i++) { if(!vis[i][j]) { k=i+1; while(k<=10&&!vis[k][j]) k++; if(k<=10) { g[i][j]=g[k][j]; vis[i][j]=true; vis[k][j]=false; } else break; } } } for(j=1;j<15;j++) { if(vis[1][j]==false) { k=j+1; while(k<=15&&!vis[1][k]) k++; if(k>15) break; else { i=1; while(i<=10&&vis[i][k]) { vis[i][j]=true; vis[i][k]=false; g[i][j]=g[i][k]; i++; } } } } } void solve() { int i,j,step=1; ball m; int sum=150,score=0;; memset(vis,true,sizeof(flag)); while(1) { m.max =0; memset(flag,true,sizeof(flag)); for(j=1;j<=15;j++) for(i=1;i<=10;i++) { if(vis[i][j]&&flag[i][j]) { flag[i][j]=false; int k=dfs(i,j); if(k>m.max ) {m.max =k;m.x=i;m.y=j;} } } if(m.max <=1) break; sum-=m.max ; score+=(m.max -2)*(m.max -2); printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points./n",step++,m.x,m.y,m.max ,g[m.x][m.y],(m.max -2)*(m.max -2)); memset(flag,true,sizeof(flag)); flag[m.x][m.y]=false; dfs(m.x,m.y); for(i=1;i<=10;i++) for(j=1;j<=15;j++) { if(!flag[i][j]) vis[i][j]=flag[i][j]; } update(); } if(sum==0) score+=1000; printf("Final score: %d, with %d balls remaining. /n/n",score,sum); } int main() { int ca=1,n; int i,j; cin>>n; while(n--) { for(i=10;i>0;i--) for(j=1;j<=15;j++) cin>>g[i][j]; printf("Game %d: /n/n",ca++); solve(); } return 0; }