题意是给你一张上面画有骰子的图片,然你搜索出每个骰子上面的点数。
DFS题,实际上是两部分的DFS,先DFS骰子,然后在其中DFS到点数,把搜索过的点数标记为普通骰子,把搜索过的骰子标记成为背景。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 55
#define INF 1<<25
#define MAX 0x7fffffff
typedef long long ll;
using namespace std;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
char ss[maxn][maxn];
int cc[maxn*maxn];
int top,ans;
int xx,yy;
int init()
{
memset(cc,0,sizeof(cc));
top=0;
ans=0;
}
int cango(int x,int y)
{
if(x>=0&&x<xx&&y>=0&&y<yy)
return 1;
return 0;
}
int Cdfs(int x,int y)
{
ss[x][y]='*';
for(int i=0; i<4; i++)
{
int lx=x+dir[i][0];
int ly=y+dir[i][1];
if(cango(lx,ly))
{
if(ss[lx][ly]=='X')
{
Cdfs(lx,ly);
}
}
}
}
int Bdfs(int x,int y)
{
ss[x][y]='.';
for(int i=0; i<4; i++)
{
int lx=x+dir[i][0];
int ly=y+dir[i][1];
if(cango(lx,ly))
{
if(ss[lx][ly]=='X')
{
cc[top]++;
Cdfs(lx,ly);
}
if(ss[lx][ly]=='*')
Bdfs(lx,ly);
}
}
}
int main()
{
int ii=1;
while(scanf("%d%d",&yy,&xx))
{
if(xx==0&&yy==0)
return 0;
init();
for(int i=0; i<xx; i++)
cin>>ss[i];
for(int i=0; i<xx; i++)
{
for(int j=0; j<yy; j++)
{
if(ss[i][j]=='*')
{
Bdfs(i,j);
top++;
}
}
}
sort(cc,cc+top);
printf("Throw %d\n",ii++);
printf("%d",cc[0]);
for(int i=1; i<top; i++)
printf(" %d",cc[i]);
printf("\n");
printf("\n");
}
}