//poj 1027 The Same Game (模拟) /* 题解: 数据量很小的模拟题,直接按题意做就行了。 */ #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int inf = 1<<28; int n,m; char str[11][20]; int id[11][20],mark[11][20]; int move[4][2]={-1,0,0,1,1,0,0,-1}; int sum,cnt; void dfs(int v,int w) { id[v][w]=cnt; ++sum; int x,y; for (int i=0;i<4;i++) { x=v+move[i][0],y=w+move[i][1]; if (x>=1 && x<=10 && y>=1 && y<=15 && str[v][w]==str[x][y]) { if (id[x][y]==-1) dfs(x,y); } } } void clear(int d) { int top,r=0; for (int j=1;j<=15;j++) { top=0; for (int i=1;i<=10;i++) if (str[i][j]!=' ' && id[i][j]!=d) { str[++top][j-r]=str[i][j]; } if (top==0) ++r; for (int i=(r?1:top+1);i<=10;i++) str[i][j]=' '; } //printf("%d/n",r); } void solve() { int Max,x,y,ans=0,b=150,tm=0; while (++tm) { memset(id,-1,sizeof(id)); cnt=Max=0; for (int j=1;j<=15;j++) for (int i=1;i<=10;i++) if (id[i][j]==-1 && str[i][j]!=' ') { sum=0; ++cnt; dfs(i,j); if (sum>Max){ x=i,y=j; Max=sum; } } if (Max<=1) break; b-=Max; printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points./n", tm,x,y,Max,str[x][y],(Max-2)*(Max-2)); ans+=(Max-2)*(Max-2); clear(id[x][y]); /*if (tm==10) { for (int i=10;i>=1;i--) printf("%s/n",str[i]+1); break; }*/ } if (Max==0) ans+=1000; printf("Final score: %d, with %d balls remaining./n/n",ans,b); } int main() { int t;scanf("%d",&t); for (int tm=1;tm<=t;++tm) { printf("Game %d:/n/n",tm); for (int i=10;i>=1;i--) scanf("%s",str[i]+1); solve(); } system("pause"); return 0; }