题意是给你一张上面画有骰子的图片,然你搜索出每个骰子上面的点数。
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"); } }