POJ 1481

来源:互联网 发布:php 文件管理 代码 编辑:程序博客网 时间:2024/06/06 14:03

AC啦!!!此题用到了两个DFS,刚开始一直认为两个DFS是交叉的,一直是错。后来从最简单的方面考虑,它遍历它的,它遍历它的,最后搞出来啦。

#include <stdio.h>#include <memory.h>#include <stdlib.h>const int maxn=50+10;char map[maxn][maxn];int visit[maxn][maxn];int visit2[maxn][maxn];int total[maxn];int amount=0;int m,n,flag;int count1;int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};void dfs(int x,int y);void dfs2(int x,int y);int cmp(const void* aa,const void* bb){int* a=(int*)aa;int* b=(int*)bb;return *a-*b;}int main(){while(scanf("%d %d",&n,&m)==2){if(n==0) break;count1=0;        memset(total,0,sizeof(total));memset(visit,0,sizeof(visit));memset(visit2,0,sizeof(visit2));amount++;int i,j;for(i=0;i<m;i++){    scanf("%s",map[i]);}for(i=0;i<m;i++){for(j=0;j<n;j++){if((map[i][j]=='*'||map[i][j]=='X')&&!visit[i][j]){                    count1++;dfs(i,j);}}}qsort(total,count1,sizeof(int),cmp);printf("Throw %d\n",amount);int k;for(k=0;k<count1-1;k++){if(total[k]!=0) printf("%d ",total[k]);}printf("%d\n",total[k]);printf("\n");}return 0;}void dfs(int x,int y){int dx,dy;if(map[x][y]=='.'||visit[x][y]||x<0||x>=m||y<0||y>=n) return;else{        visit[x][y]=1;if(map[x][y]=='X'&&visit2[x][y]==0){total[count1-1]++;for(int k=0;k<4;k++){dx=x+dir[k][0];dy=y+dir[k][1];dfs2(dx,dy);}}for(int k=0;k<4;k++){dx=x+dir[k][0];dy=y+dir[k][1];dfs(dx,dy);}}}void dfs2(int x,int y){int dx,dy;if(map[x][y]=='.'||visit2[x][y]||x<0||x>=m||y<0||y>=n||map[x][y]=='*') return;    else{visit2[x][y]=1;int i;for(i=0;i<4;i++){dx=x+dir[i][0];dy=y+dir[i][1];dfs2(dx,dy);}}}