657 - The die is cast(****)

/* 题不错,**** 题意:一幅图,*和X相连的为一块,找出每一块中X的个数, 若X相连被认为是一个。然后排序后输出各块中X的个数 实现:使用数组arr来存储一块,数组account记录X的个数 更好的解法:使用两个数组visit1和visit2,和两个搜索dfs1,dfs2 这样一次历编就可以求出结果。 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int nMax=55; int w,h; char G[nMax][nMax]; bool visit[nMax][nMax]; int account[nMax]; struct Node { int x,y; Node(){} Node(int x,int y):x(x),y(y){} }; struct Array { Node data[nMax*nMax]; int top; Array(){top=0;} }arr[nMax*nMax]; int u; int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; bool check(int x,int y) { if(x>=0 && x<h && y>=0 && y<w) return true; return false; } void Init(int x,int y,int n) { visit[x][y]=1; arr[n].data[arr[n].top++]=Node(x,y); for(int i=0;i<4;i++) { int xx,yy; xx=x+dir[i][0]; yy=y+dir[i][1]; if(check(xx,yy) && G[xx][yy]!='.' && !visit[xx][yy]) Init(xx,yy,n); } } void dfs(int x,int y,int n) { visit[x][y]=1; for(int i=0;i<4;i++) { int xx,yy; xx=x+dir[i][0]; yy=y+dir[i][1]; if(check(xx,yy) && G[xx][yy]=='X' && !visit[xx][yy]) dfs(xx,yy,n); } } int main() { //freopen("data.in","r",stdin); int cas=1; while(scanf("%d %d",&w,&h)==2) { if(w==0 && h==0) break; memset(G,0,sizeof(G)); memset(visit,0,sizeof(visit)); memset(account,0,sizeof(account)); memset(arr,0,sizeof(arr));//WA原因,必须对其进行初始化 printf("Throw %d\n",cas++); int n=0; u=0; for(int i=0;i<h;i++) scanf("%s",G[i]); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { if(!visit[i][j] && G[i][j]!='.') Init(i,j,u++); } } memset(visit,0,sizeof(visit)); for(int i=0;i<u;i++) { for(int j=0;j<arr[i].top;j++) { int xx,yy; xx=arr[i].data[j].x; yy=arr[i].data[j].y; if(G[xx][yy]=='X' && !visit[xx][yy]) { account[i]++; dfs(xx,yy,i); } } } sort(account,account+u); for(int i=0;i<u;i++) { if(i) printf(" "); printf("%d",account[i]); } printf("\n\n"); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值