题意:给一张有很多个(至少一个)骰子的图片,判断骰子上的点数。这张图片有三种像素组成,分别是 ' . '表示背景, ' * '表示骰子, ' X '骰子中的点;两个像素共用一条边表示连接,而共用一角却不表示连接。
这道题的关键是在判断完是'X'后要立马接着往下判断是否有'*',应为要一条路搜到底,否则可能有遗漏
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int m, n;
int ans;
char g[55][55];
int vis[55][55];
int dir[4][2] = {{1, 0},{0, -1},{-1, 0},{0, 1}};
int num[1005];
void dfs2(int x, int y) {
g[x][y] = '*';
for(int i=0; i<4; i++) {
int newx = x+dir[i][0];
int newy = y+dir[i][1];
if(g[newx][newy]=='X') {
dfs2(newx,newy);
}
}
}
void dfs1(int x, int y) {
//vis[x][y] = 1;
g[x][y]='.';
for(int i=0; i<4; i++) {
int newx = x+dir[i][0];
int newy = y+dir[i][1];
if(g[newx][newy]=='X') {
dfs2(newx, newy);
num[ans]++;
//printf("yes\n");
}
if(g[newx][newy]=='*' && !vis[newx][newy]) {
dfs1(newx,newy);
}
}
}
void deal() {
ans=0;
memset(vis, 0, sizeof(vis));
int i;
for(i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(g[i][j]=='*'&& !vis[i][j]) {
dfs1(i,j);
ans++;
}
}
}
sort(num, num+ans);
printf("%d", num[0]);
for(i=1; i<ans; i++) {
printf(" %d",num[i]);
}
printf("\n");
}
int main() {
int i, j;
int kase=1;
while(scanf("%d%d", &m, &n) && m && n) {
memset(num, 0, sizeof(num));
memset(g, '.', sizeof(g));
for(i=0; i<n; i++) {
getchar();
for(j=0; j<m; j++) {
scanf("%c", &g[i][j]);
}
}
printf("Throw %d\n", kase++);
deal();
printf("\n");
}
return 0;
}