The Same Game--POJ 1027

1、题目类型:模拟、贪心。

2、解题思路:(1)根据输入的map[][]从左往右逐列、从下往上逐列BFS寻找并标记最大块;(2)对最大块进行删除操作,并更新map[][];(3)知道map[][]中节点删除完毕或者无法再删除,则输出总得分。

3、注意事项:注意运用scanf()获得输入字符串、cin.getline() WA了好些次。

4、实现方法:

#include<iostream>
using namespace std;

int dir[4][2]={
{
1,0},{0,1},{0,-1},{-1,0}
};

typedef
struct Node
{
int x,y;
}queue;

queue que[
155];
char map[12][16];
int belong[12][16],spaceline[16];
int index,m;

//从Node节点BFS标记块,返回块的大小
int BFS(int x,int y)
{
int i,cnt=1,front=0,rear=0;
Node tmp,t;
index
++;
tmp.x
=x;
tmp.y
=y;
belong[x][y]
=index;
que[rear
++]=tmp;
while(front!=rear)
{
tmp
=que[front];
front
++;
for(i=0;i<4;i++)
{
t.x
=tmp.x+dir[i][0];
t.y
=tmp.y+dir[i][1];
if( t.x>=10 || t.x<0 || t.y>=15 || t.y<0 || belong[t.x][t.y] || map[t.x][t.y]==' ')
continue;
if( map[t.x][t.y]==map[tmp.x][tmp.y])
{
belong[t.x][t.y]
=index;
cnt
++;
que[rear
++]=t;
}
}
}
return cnt;
}

//删除块中各个Node
void Del(int p)
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<15;j++)
if(belong[i][j]==p)
{
map[i][j]
=' ';
}
}

//更新map[][]便于下一次遍历
void Change()
{
int i,j,pos,k=0;
bool flag1,flag2;
memset(spaceline,
-1,sizeof(spaceline));
for(j=0;j<15;j++)
{
flag1
=0;
flag2
=0;
for(i=0;i<10;i++)
{
if(!flag1 && map[i][j]==' ')
{
pos
=i;flag1=1;
}
if(map[i][j]!=' ')
{
flag2
=1;
}
}
if(flag1 && flag2)
{
for(i=pos+1;i<10;i++)
{
if(map[i][j]!=' ')
{
map[pos
++][j]=map[i][j];
map[i][j]
=' ';
}
}
}
if( !flag2 )
{
spaceline[k
++]=j;
}
}
if(k)
{
int t=spaceline[0],p=1;
for(i=spaceline[0]+1;i<15;i++)
{
if(i==spaceline[p])
{
p
++;
continue;
}
for(j=0;j<10;j++)
{
map[j][t]
=map[j][i];
map[j][i]
=' ';
}
t
++;
}
}
}

void Solve()
{
int i,j,x,y;
int cost=0,n=0,sum=0;
char ch;
while (cost<10*15-1)
{
n
++;
memset(belong,
0,sizeof(belong));
m
=0;
index
=0;
for(i=0;i<15;i++)
{
for(j=0;j<10;j++)
{
if(map[j][i]!=' ' && !belong[j][i])
{
int t=BFS(j,i);
if(t>m)
{
ch
=map[j][i];
m
=t;x=j;y=i;
}
}
}
}
if(m<2)
break;
cost
+=m;
i
=(m-2)*(m-2);
sum
+=i;
cout
<<"Move "<<n<<" at ("<<x+1<<','<<y+1<<"): removed "<<m<<" balls of color "<<ch<<", got "<<i<<" points."<<endl;
Del(belong[x][y]);
Change();
}
if(cost==150)
sum
+=1000;
cout
<<"Final score: "<<sum<<", with "<<150-cost<<" balls remaining."<<endl<<endl;
}

int main()
{
int c,i,k;
scanf(
"%d\n",&c);
for(k=1;k<=c;k++)
{
for(i=1;i<=10;i++)
{
scanf(
"%s",&map[10-i]);
}
cout
<<"Game "<<k<<':'<<endl<<endl;;
Solve();
}
return 0;
}

 

posted @ 2010-09-24 10:11  勇泽  阅读(397)  评论(0编辑  收藏  举报