题意:在图上找出有多少个色子,还有点数是多少,按大小排序
思路:我们首先先找到色子的面,然后在广搜它的点数 。 。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
char map[60][60];
int vis[60][60];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int w,h,dieNum,dotNum;
struct Node
{
int x,y;
};
Node que[100000];
void bfs(int x,int y)
{
int front = 0,rear = 1 ;
que[0].x = x ;
que[0].y = y ;
while (front < rear)
{
Node t = que[front++];
for (int i = 0 ; i < 4 ; i++)
{
int dx = t.x + dir[i][0];
int dy = t.y + dir[i][1];
if (map[dx][dy] == '*' || map[dx][dy] == '.')
continue ;
if (dx >= 0 && dx < h && dy >= 0 && dy < w && map[dx][dy]=='X')
{
map[dx][dy] = '@';
Node temp ;
temp.x = dx ,temp.y = dy ;
que[rear++] = temp;
}
}
}
}
void dfs(int x,int y)
{
for (int i = 0 ; i < 4 ; i++)
{
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if (map[dx][dy] == 'X')
{
dotNum++;
map[dx][dy] = '@';
bfs(dx,dy);
}
if (map[dx][dy] == '.')
continue ;
if (dx >= 0 && dx < h && dy >= 0 && dy < w && !vis[dx][dy] && (map[dx][dy] == '*' || map[dx][dy] == 'X' || map[dx][dy] == '@'))
{
vis[dx][dy] = dieNum ;
dfs(dx,dy);
}
}
}
int main()
{
int cas = 1;
while (scanf("%d %d%*c",&w,&h)!= EOF && w && h)
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
for (int i = 0 ; i < h ; i++)
gets(map[i]);
dieNum = 1;
vector<int>result ;
result.clear();
for (int i = 0 ; i < h ; i++)
for (int j = 0 ; j < w ; j++)
{
if (map[i][j] == '*' && !vis[i][j])
{
vis[i][j] = dieNum;
dotNum = 0 ;
dfs(i,j);
result.push_back(dotNum);
dieNum++;
}
}
printf("Throw %d\n",cas++);
sort(result.begin(),result.begin()+result.size());
if (result[0] != 0)
{
printf("%d",result[0]);
for (int i = 1 ; i < result.size() ; i++)
printf(" %d",result[i]);
}
printf("\n\n");
}
return 0 ;
}