//poj 1027
//sep9
#include <iostream>
using namespace std;
int leave,score;
int rx,ry,n,cnt;
char g[20][20];
bool vis[20][20];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool inGraph(int x,int y)
{
return x>=0&&x<10&&y>=0&&y<15;
}
void dfs(int x,int y)
{
vis[x][y]=true;
++cnt;
for(int i=0;i<4;++i){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(inGraph(nx,ny)&&g[x][y]==g[nx][ny]&&!vis[nx][ny])
dfs(nx,ny);
}
}
bool choose()
{
memset(vis,false,sizeof(vis));
n=0;
for(int i=0;i<15;++i)
for(int j=9;j>=0;--j){
if(g[j][i]==' '||vis[j][i]) continue;
cnt=0;
dfs(j,i);
if(cnt>n){
n=cnt;
rx=j,ry=i;
}
}
return n>=2;
}
void shift()
{
for(int i=0;i<15;++i){
int pos=9;
for(int j=9;j>=0;--j){
if(g[j][i]!=' ')
g[pos--][i]=g[j][i];
}
while(pos>=0) g[pos--][i]=' ';
}
int pos=0;
for(int i=0;i<15;++i){
if(g[9][i]!=' '){
for(int j=0;j<10;++j)
g[j][pos]=g[j][i];
++pos;
}
}
while(pos<15){
for(int j=0;j<10;++j)
g[j][pos]=' ';
++pos;
}
}
void remove(int x,int y)
{
char color=g[x][y];
g[x][y]=' ';
for(int i=0;i<4;++i){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(inGraph(nx,ny)&&g[nx][ny]==color)
remove(nx,ny);
}
}
int main()
{
int cases;
scanf("%d",&cases);
for(int t=1;t<=cases;++t){
leave=150;
score=0;
for(int i=0;i<10;++i)
scanf("%s",g[i]);
printf("Game %d:\n\n",t);
int step=0;
while(choose()){
step++;
printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",
step,10-rx,ry+1,n,g[rx][ry],(n-2)*(n-2));
score+=(n-2)*(n-2);
leave-=n;
remove(rx,ry);
shift();
}
if(leave==0) score+=1000;
printf("Final score: %d, with %d balls remaining.\n\n",score,leave);
}
return 0;
}
poj 1027 The Same Game 模拟
最新推荐文章于 2020-07-22 16:02:07 发布