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 ;
}

 

你可能感兴趣的:(game)